แก้ไข: ฉันทดลองบางอย่างและค้นพบสิ่งที่ละเอียดกว่าที่ฉันคิดไว้เล็กน้อย นี่คือสิ่งที่ฉันคิดว่าตอนนี้เป็นคำตอบที่ถูกต้อง
&sไม่ได้เป็น lvalue constเพื่อให้คุณไม่สามารถสร้างการอ้างอิงถึงมันจนกว่าประเภทของการอ้างอิงการอ้างอิงถึง ตัวอย่างเช่นคุณไม่สามารถทำได้
string * &r = &s;
แต่คุณสามารถทำได้
string * const &r = &s;
หากคุณใส่คำประกาศที่คล้ายกันในส่วนหัวของฟังก์ชันก็จะใช้ได้
void myfunc(string * const &a) { ... }
ยังมีอีกประเด็นหนึ่งคือ กฎคือคุณจะได้รับการอ้างอิงไปยังชั่วคราวก็ต่อเมื่อเป็นconstเช่นนั้น ดังนั้นในกรณีนี้อาจมีคนโต้แย้งว่า & s เป็นแบบชั่วคราวและต้องประกาศconstในฟังก์ชันต้นแบบ จากมุมมองในทางปฏิบัติมันไม่ได้สร้างความแตกต่างในกรณีนี้ (เป็นค่า rvalue หรือชั่วคราวไม่ว่าจะด้วยวิธีใดก็ใช้กฎเดียวกัน) อย่างไรก็ตามพูดอย่างเคร่งครัดฉันคิดว่ามันไม่ใช่ค่าชั่วคราว แต่เป็นค่า rvalue ฉันสงสัยว่ามีวิธีแยกแยะระหว่างสองอย่างนี้หรือไม่ (บางทีมันอาจจะกำหนดง่ายๆว่าชั่วคราวทั้งหมดเป็นค่า rvalues และค่าที่ไม่ใช่ lvalues ทั้งหมดเป็นชั่วคราวฉันไม่ใช่ผู้เชี่ยวชาญในมาตรฐานนี้)
ดังที่กล่าวมาปัญหาของคุณน่าจะอยู่ในระดับที่สูงขึ้น ทำไมคุณถึงต้องการอ้างอิงไปยังที่อยู่ของs? หากคุณต้องการอ้างอิงถึงตัวชี้sคุณต้องกำหนดตัวชี้เป็นใน
string *p = &s;
myfunc(p);
หากคุณต้องการอ้างอิงsหรือชี้ไปให้sทำสิ่งที่ตรงไปตรงมา
string* const& valconst string* &valในสายตาของฉันนี่เป็นการอ้างอิง const อย่างชัดเจนถึงตัวชี้ไปยังสตริง โดยส่วนตัวฉันชอบเขียนT const&แทนการconst T&ประกาศเพื่อให้ได้คำชี้แจงที่แน่นอนนี้