EDIT: Tôi đã thử nghiệm một số, và phát hiện ra một điều tinh tế hơn tôi nghĩ. Đây là những gì tôi nghĩ bây giờ là một câu trả lời chính xác.
&s
không phải là một giá trị vì vậy bạn không thể tạo tham chiếu đến nó trừ khi loại tham chiếu được tham chiếu đến const
. Vì vậy, ví dụ, bạn không thể làm
string * &r = &s;
nhưng bạn có thể làm
string * const &r = &s;
Nếu bạn đặt một khai báo tương tự trong tiêu đề hàm, nó sẽ hoạt động.
void myfunc(string * const &a) { ... }
Có một vấn đề khác, cụ thể là, tạm thời. Quy tắc là bạn chỉ có thể nhận được một tham chiếu đến tạm thời nếu có const
. Vì vậy, trong trường hợp này, người ta có thể lập luận rằng & s là tạm thời và do đó phải được khai báo const
trong nguyên mẫu hàm. Từ quan điểm thực tế, nó không có sự khác biệt trong trường hợp này. (Đó là một giá trị hoặc tạm thời. Dù bằng cách nào, quy tắc tương tự cũng được áp dụng.) Tuy nhiên, nói đúng ra, tôi nghĩ rằng đó không phải là tạm thời mà là một giá trị. Tôi tự hỏi nếu có một cách để phân biệt giữa hai. (Có lẽ nó được định nghĩa đơn giản rằng tất cả các thời gian là giá trị và tất cả các giá trị không phải là giá trị tạm thời. Tôi không phải là chuyên gia về tiêu chuẩn.)
Điều đó đang được nói, vấn đề của bạn có thể ở mức cao hơn. Tại sao bạn muốn một tài liệu tham khảo đến địa chỉ của s
? Nếu bạn muốn tham chiếu đến một con trỏ tới s
, bạn cần xác định một con trỏ như trong
string *p = &s;
myfunc(p);
Nếu bạn muốn một tham chiếu đến s
hoặc một con trỏ tới s
, hãy làm điều đơn giản.
string* const& val
thay vì tương đương ít dễ đọc hơn, ví dụ nhưconst string* &val
. Đối với tôi đây rõ ràng là một tham chiếu const , đến một con trỏ, một chuỗi. Cá nhân tôi thích viếtT const&
thay vìconst T&
trong các tờ khai để có được sự làm rõ chính xác này.