EDIT: Ho sperimentato un po ', e ho scoperto cosa sono un po' più sottile di quanto pensassi.Ecco quello che ora penso sia una risposta accurata.
&s
non è un lvalue quindi non è possibile creare un riferimento ad esso a meno che il tipo di riferimento sia riferimento a const
. Così, per esempio, non si può fare
string * &r = &s;
ma si può fare
string * const &r = &s;
Se si mette una dichiarazione simile nell'intestazione della funzione, funzionerà.
void myfunc(string * const &a) { ... }
C'è un altro problema, vale a dire, provvisori. La regola è che puoi ottenere un riferimento a un temporaneo solo se è const
. Quindi in questo caso si potrebbe sostenere che & s è temporaneo, e quindi deve essere dichiarato const
nel prototipo di funzione. Da un punto di vista pratico non fa differenza in questo caso. (È un valore o un valore temporaneo. Ad ogni modo, si applica la stessa regola.) Tuttavia, a rigor di termini, penso che non sia un valore temporaneo, ma un valore. Mi chiedo se c'è un modo per distinguere tra i due. (Forse è semplicemente definito che tutti i provvisori sono valori e tutti i non valori sono temporanei. Io non sono un esperto dello standard.)
Detto questo, il problema è probabilmente ad un livello più alto. Perché vuoi un riferimento all'indirizzo s
? Se si desidera un riferimento a un puntatore a s
, è necessario definire un puntatore come in
string *p = &s;
myfunc(p);
Se si desidera un riferimento a s
o un puntatore a s
, fare la cosa semplice.
Per quello che sto facendo, però, ho bisogno dell'indirizzo del puntatore e del puntatore stesso. Non voglio passare il puntatore in base al valore. – Alex
Ancora non capisco cosa cerchi di realizzare. Non puoi avere "indirizzo del puntatore" di "stringa s", semplicemente perché "stringa s" non è un puntatore. – Sake
@Alex: Considero che è necessario rilevare se la stringa è esattamente la stessa di un'altra che si sta memorizzando e non solo se il loro contenuto è lo stesso. Se questo è il caso, si noti che è possibile utilizzare l'operatore address-of per un riferimento e otterrà l'indirizzo dell'oggetto referenziato: void f (std :: string const & s) {std :: string const * p = & s; } –