Por lo que puedo decir, no hay razón para que no se me permita pasar una referencia a un puntero en C ++. Sin embargo, mis intentos de hacerlo están fallando, y no tengo idea de por qué.
Esto es lo que estoy haciendo:
void myfunc(string*& val)
{
// Do stuff to the string pointer
}
// sometime later
{
// ...
string s;
myfunc(&s);
// ...
}
Y obtengo este error:
no se puede convertir el parámetro 1 de 'std :: string *' a 'std :: string * &'
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.bind a temporary to the reference
es más clara en esta respuesta que @Chris 'asreference to an actual string pointer in the calling scope, not an anonymous string pointer
. Independientemente, ambos son probablemente correctos desde mi perspectiva.const string*&
y enstring* const&
realidad son diferentes tipos. El primero es una noconst
referencia a aconst string*
, mientras que el segundo es unaconst
referencia a astring*
.T const&
aconst T&
- como señala @Justin Time, son diferentes tipos. Es posible que no tienen consecuencias a veces, pero en otras situaciones será absolutamente crítico para preferir uno u otro, al igual que prefierenint
adouble
.Cámbielo a:
EDITAR:
Esto se llama
ref-to-pointer
y no puede pasar una dirección temporal como referencia para funcionar. (a menos que lo seaconst reference
)Sin embargo, he mostrado
std::string* pS = &s;
(puntero a una variable local), su uso típico sería: cuando desea que la persona que llama cambie el puntero en sí, no el objeto al que apunta. Por ejemplo, una función que asigna memoria y asigna la dirección del bloque de memoria que asignó a su argumento debe tomar una referencia a un puntero, o un puntero a puntero:fuente
&s
produce un puntero temporal a una cadena y no puede hacer referencia a un objeto temporal.fuente
Tratar:
o
fuente
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 élconst
. Entonces, por ejemplo, no puedes hacerpero puedes hacer
Si coloca una declaración similar en el encabezado de la función, funcionará.
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 declararseconst
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 punteros
, debe definir un puntero como enSi desea una referencia
s
o un punteros
, haga lo más sencillo.fuente
Acabo de hacer uso de una referencia a un puntero para hacer que todos los punteros en un árbol binario eliminado, excepto la raíz, sean seguros. Para hacer que el puntero sea seguro, solo tenemos que establecerlo en 0. No pude hacer que la función que elimina el árbol (manteniendo solo la raíz) acepte una referencia a un puntero ya que estoy usando la raíz (este puntero) como primer entrada para recorrer izquierda y derecha.
En pocas palabras, una referencia a un puntero no es válida cuando el parámetro formal es el (este) puntero.
fuente
Bienvenido a C ++ 11 y referencias de valor:
Ahora tiene acceso al valor del puntero (al que se refiere
val
), que es la dirección de la cadena.Puede modificar el puntero y a nadie le importará. Ese es un aspecto de lo que es un valor en primer lugar.
Tenga cuidado: el valor del puntero solo es válido hasta que
myfunc()
regrese. Por fin, es temporal.fuente
Sé que es posible pasar referencias de punteros, lo hice la semana pasada, pero no recuerdo cuál era la sintaxis, ya que su código parece correcto para mi cerebro en este momento. Sin embargo, otra opción es utilizar punteros de punteros:
fuente
myfunc ("string * & val") esto en sí mismo no tiene ningún sentido. "string * & val" implica "string val", * y & se cancelan entre sí. Finalmente, uno no puede pasar la variable de cadena a una función ("string val"). Solo los tipos de datos básicos se pueden pasar a una función, ya que otros tipos de datos deben pasar como puntero o referencia. Puede tener string & val o string * val para una función.
fuente