EDYCJA: trochę eksperymentowałem i odkryłem, że rzeczy są nieco subtelniejsze niż myślałem. Oto, co teraz uważam za dokładną odpowiedź.
&s
nie jest lwartością, więc nie można utworzyć do niej odwołania, chyba że jest to odniesienie do typu const
. Na przykład nie możesz tego zrobić
string * &r = &s;
ale możesz to zrobić
string * const &r = &s;
Jeśli umieścisz podobną deklarację w nagłówku funkcji, zadziała.
void myfunc(string * const &a) { ... }
Jest jeszcze jedna kwestia, a mianowicie prowizoryczne. Zasada jest taka, że odwołanie do pliku tymczasowego można uzyskać tylko wtedy, gdy tak jest const
. Więc w tym przypadku można by argumentować, że & s jest tymczasowe i dlatego musi być zadeklarowane const
w prototypie funkcji. Z praktycznego punktu widzenia nie ma to znaczenia w tym przypadku. (Jest to albo wartość r, albo wartość tymczasowa. Tak czy inaczej, obowiązuje ta sama reguła.) Jednakże, mówiąc ściśle, myślę, że nie jest to wartość tymczasowa, ale wartość r. Zastanawiam się, czy istnieje sposób na rozróżnienie tych dwóch. (Być może jest po prostu zdefiniowane, że wszystkie wartości tymczasowe są wartościami r, a wszystkie wartości inne niż l są tymczasowe. Nie jestem ekspertem w zakresie standardów).
Biorąc to pod uwagę, twój problem jest prawdopodobnie na wyższym poziomie. Dlaczego chcesz podać adres s
? Jeśli chcesz odwołać się do wskaźnika do s
, musisz zdefiniować wskaźnik, tak jak w
string *p = &s;
myfunc(p);
Jeśli chcesz mieć odniesienie s
lub wskaźnik do s
, zrób prostą rzecz.
string* const& val
zamiast mniej czytelnego odpowiednika, jak npconst string* &val
. Dla moich oczu jest to wyraźnie odniesienie do stałej , do wskaźnika, do struny. Osobiście wolę pisaćT const&
zamiastconst T&
deklaracji, aby uzyskać to dokładne wyjaśnienie.