EDITAR: Experimenté un poco, y descubrí que las cosas son un poco más sutiles de lo que pensaba. Esto es lo que ahora creo que es una respuesta precisa.
&s
no es un valor de l, por lo que no puede crear una referencia a menos que el tipo de referencia haga referencia a él const
. Entonces, por ejemplo, no puedes hacer
string * &r = &s;
pero puedes hacer
string * const &r = &s;
Si coloca una declaración similar en el encabezado de la función, funcionará.
void myfunc(string * const &a) { ... }
Hay otro problema, a saber, los temporales. La regla es que puede obtener una referencia a un temporal solo si es así const
. Entonces, en este caso, se podría argumentar que & s es temporal, por lo que debe declararse const
en el prototipo de la función. Desde un punto de vista práctico, no hay diferencia en este caso. (Es un valor o un valor temporal. De cualquier manera, se aplica la misma regla). Sin embargo, estrictamente hablando, creo que no es un valor temporal sino un valor. Me pregunto si hay una manera de distinguir entre los dos. (Quizás se define simplemente que todos los temporales son valores, y todos los que no son valores son temporales. No soy un experto en el estándar).
Dicho esto, su problema probablemente esté en un nivel superior. ¿Por qué quieres una referencia a la dirección de s
? Si desea una referencia a un puntero s
, debe definir un puntero como en
string *p = &s;
myfunc(p);
Si desea una referencia s
o un puntero s
, haga lo más sencillo.
string* const& val
en lugar de un equivalente de menos legibles, como por ejemploconst string* &val
. A mis ojos, esto es claramente una referencia constante , a un puntero, a una cadena. Personalmente prefiero escribir enT const&
lugar deconst T&
declaraciones para obtener esta aclaración exacta.