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.
&sno 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 consten 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 so un puntero s, haga lo más sencillo.
string* const& valen 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.