EDIT: Ja eksperymentowałem trochę i odkrył rzeczą są nieco subtelniejszy niż myślałem.Oto, co teraz uważam za dokładną odpowiedź.
&s
nie jest lwartością, więc nie można utworzyć odwołania do niego, chyba że typ odniesienia odnosi się do const
. Tak na przykład, nie można zrobić
string * &r = &s;
ale można zrobić
string * const &r = &s;
Jeśli umieścisz podobną deklarację w nagłówku funkcji, to będzie działać.
void myfunc(string * const &a) { ... }
Istnieje inna kwestia, a mianowicie tymczasowe. Zasadą jest, że można uzyskać odniesienie do tymczasowego tylko wtedy, gdy jest to const
. Tak więc w tym przypadku można argumentować, że & s jest tymczasowe, a więc musi zostać zadeklarowane jako prototyp funkcji const
. Z praktycznego punktu widzenia nie ma w tym przypadku znaczenia. (Jest to albo wartość rubliczna, albo tymczasowa. Tak czy inaczej, obowiązuje ta sama zasada.) Jednakże, ściśle rzecz biorąc, uważam, że nie jest to tymczasowa, lecz rwaluta. Zastanawiam się, czy istnieje sposób na rozróżnienie tych dwóch. (Być może jest to po prostu zdefiniowane, że wszystkie tymczasowe są rwartościami, a wszystkie nie-l-wartości są tymczasowymi.) Nie jestem ekspertem od standardu.)
W związku z tym twój problem jest prawdopodobnie na wyższym poziomie. Dlaczego chcesz odwołać się do adresu s
? Jeśli chcesz odniesienie do wskaźnika do s
, trzeba zdefiniować jako wskaźnik w
string *p = &s;
myfunc(p);
Jeśli chcesz odniesienie do s
lub wskaźnik do s
, wykonaj prostą rzeczą.
Do tego, co robię, potrzebuję adresu wskaźnika oraz samego wskaźnika. Nie chcę przekazywać wskaźnika przez wartość. – Alex
Nadal nie rozumiem, co próbujesz osiągnąć. Nie możesz mieć "adresu wskaźnika" ciągu "s", po prostu dlatego, że "ciąg s" nie jest wskaźnikiem. – Sake
@Alex: Rozumiem, że potrzebujesz wykryć, czy ciąg jest dokładnie taki sam, jak inny, który przechowujesz, a nie tylko to, czy ich zawartość jest taka sama. W takim przypadku zwróć uwagę, że możesz użyć operatora adresu do referencji, a otrzymasz adres obiektu, do którego się odwołujesz: void f (std :: string const & s) {std :: string const * p = & s; } –