EDIT: J'en ai expérimenté, et j'ai découvert que les choses sont un peu plus subtiles que je ne le pensais. Voici ce que je pense maintenant être une réponse exacte.
&s
n'est pas une lvalue, vous ne pouvez donc pas y créer de référence à moins que le type de la référence ne fasse référence à const
. Donc, par exemple, vous ne pouvez pas faire
string * &r = &s;
mais tu peux faire
string * const &r = &s;
Si vous mettez une déclaration similaire dans l'en-tête de la fonction, cela fonctionnera.
void myfunc(string * const &a) { ... }
Il y a un autre problème, celui des temporaires. La règle est que vous ne pouvez obtenir une référence à un temporaire que si c'est le cas const
. Donc, dans ce cas, on pourrait affirmer que & s est temporaire et doit donc être déclaré const
dans le prototype de fonction. D'un point de vue pratique, cela ne fait aucune différence dans ce cas. (C'est soit une valeur, soit une valeur temporaire. De toute façon, la même règle s'applique.) Cependant, à proprement parler, je pense que ce n'est pas une valeur temporaire mais une valeur. Je me demande s'il existe un moyen de faire la distinction entre les deux. (Peut-être est-il simplement défini que toutes les valeurs temporaires sont des valeurs, et toutes les valeurs non-l sont des valeurs temporaires. Je ne suis pas un expert de la norme.)
Cela étant dit, votre problème se situe probablement à un niveau supérieur. Pourquoi voulez-vous une référence à l'adresse de s
? Si vous voulez une référence à un pointeur vers s
, vous devez définir un pointeur comme dans
string *p = &s;
myfunc(p);
Si vous voulez une référence s
ou un pointeur vers s
, faites la chose simple.
string* const& val
au lieu d'un équivalent moins lisible comme par exempleconst string* &val
. À mes yeux, c'est clairement une référence const , à un pointeur, à une chaîne. Personnellement, je préfère écrireT const&
plutôt queconst T&
dans les déclarations pour obtenir cette précision exacte.