แก้ไข: ฉันทดลองบางอย่างและค้นพบสิ่งที่ละเอียดกว่าที่ฉันคิดไว้เล็กน้อย นี่คือสิ่งที่ฉันคิดว่าตอนนี้เป็นคำตอบที่ถูกต้อง
&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& val
const string* &val
ในสายตาของฉันนี่เป็นการอ้างอิง const อย่างชัดเจนถึงตัวชี้ไปยังสตริง โดยส่วนตัวฉันชอบเขียนT const&
แทนการconst T&
ประกาศเพื่อให้ได้คำชี้แจงที่แน่นอนนี้