EDIT: He experimentado algunos, y descubrí que son un poco más sutil de lo que pensaba.Esto es lo que ahora creo que es una respuesta precisa.
&s
no es un lvalue, por lo que no puede crear una referencia a menos que el tipo de referencia sea const
. Así, por ejemplo, no se puede hacer
string * &r = &s;
pero se puede hacer
string * const &r = &s;
Si se pone una declaración similar en la cabecera de la función, que va a funcionar.
void myfunc(string * const &a) { ... }
Existe otro problema, a saber, los temporales. La regla es que puede obtener una referencia a un temporal solo si es const
. Entonces, en este caso, se podría argumentar que & s es temporal, y por lo tanto 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 rvalue o 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. (Tal vez simplemente se define que todos los temporales son valores r, y todos los valores no son temporales. No soy un experto en el estándar.)
Habiendo dicho esto, su problema es probablemente en un nivel superior. ¿Por qué quiere una referencia a la dirección de s
? Si desea una referencia a un puntero a s
, es necesario definir un puntero como en
string *p = &s;
myfunc(p);
si quieres una referencia a s
o un puntero a s
, hacer lo que es sencillo.
Por lo que estoy haciendo, necesito la dirección del puntero y del puntero. No quiero pasar el puntero por valor. – Alex
Aún no entiendo lo que trata de lograr. No puede tener "dirección del puntero" de "cadena s", simplemente porque "cadena s" no es un puntero. – Sake
@Alex: supongo que necesita detectar si la cadena es exactamente igual a otra que está almacenando y no solo si sus contenidos son los mismos. Si ese es el caso, tenga en cuenta que puede usar el operador de dirección de referencia y obtendrá la dirección del objeto al que se hace referencia: void f (std :: string const & s) {std :: string const * p = & s; } –