EDIT: ne ho sperimentato alcuni e ho scoperto che le cose sono un po 'più sottili di quanto pensassi. Ecco cosa penso ora sia una risposta accurata.
&snon è un lvalue, quindi non è possibile creare un riferimento ad esso a meno che non si faccia riferimento al tipo di riferimento const. Quindi, ad esempio, non puoi farlo
string * &r = &s;
ma puoi farcela
string * const &r = &s;
Se inserisci una dichiarazione simile nell'intestazione della funzione, funzionerà.
void myfunc(string * const &a) { ... }
C'è un altro problema, vale a dire i provvisori. La regola è che puoi ottenere un riferimento a un temporaneo solo se lo è const. Quindi in questo caso si potrebbe sostenere che & s è temporaneo e quindi deve essere dichiaratoconst nel prototipo della funzione. Da un punto di vista pratico non fa differenza in questo caso. (È un valore o un 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 provvisori. Non sono un esperto dello standard.)
Detto questo, il tuo problema è probabilmente a un livello superiore. Perché vuoi un riferimento all'indirizzo di s? Se si desidera un riferimento a un puntatore a s, è necessario definire un puntatore come in
string *p = &s;
myfunc(p);
Se vuoi un riferimento so un puntatore a s, fai la cosa semplice.
string* const& valanziché un equivalente meno leggibile come ad esconst string* &val. Ai miei occhi questo è chiaramente un riferimento costante , a un puntatore, a una stringa. Personalmente preferisco scrivereT const&invece checonst T&nelle dichiarazioni per ottenere questo preciso chiarimento.