2012-03-08 23 views
11

Duplicar posibles:
Global const string& smells bad to me, is it truly safe?¿Puede alguien explicar este uso C++ referencia

he encontré con el siguiente código y se preguntó de sus méritos

std::string const & thestring("XYZ"); 

Es la hecho de que está construyendo el objeto y refiriéndose a él por referencia. Estoy acostumbrado a ver

std::string const theString("XYZ"); 

y me preguntaba cuál era la diferencia. Estoy razonablemente contento de que el objeto no se destruya pronto ya que el objeto vive en la pila junto con la referencia.

+0

Nunca he visto el caso 1, parece que no tiene sentido. Construya un temporal y vincule una referencia constante (de este modo extiende el tiempo de vida al alcance de las referencias). El segundo caso es 1 grado menos de indirección, y para todos los efectos, actuaría como caso uno. Pero quizás me esté perdiendo algo que no es obvio. – Ylisar

+2

Esto se ve como: http://stackoverflow.com/a/1028511/390913 – perreal

+0

La única diferencia que se me ocurre es que el que no es de referencia se declaró como const, y por lo tanto se descarta la constness es UB – PlasmaHH

Respuesta

0

depende completamente de lo que esté sucediendo con la cadena donde se encuentra la función. Necesita ser guardado para ser referido.

si tiene una variable en la función que existe, digamos el objeto al que pertenece la función.

class yourClass { 
    string a; 

    string const & yourFunction(string b) { 
     a = b; 
     return a; 
    } 
} 

Además, no muy seguro de lo que sucedería si usted acaba de regresar "somestring" o directamente, pero cuando lo hace una cosa similar con inparameters funciona así:

void test(const string& value); 

Si a continuación lo haría pasar "someString" no se manejará como referencia, solo un valor. Si elimina el "const", tendrá problemas y no podrá pasar "someString" como valor.

+0

Creo que su comprensión de las referencias de const es un poco confusa (o tal vez no muy bien redactada).Un temporal puede estar ligado a una variable 'const &' o un parámetro de función, en este caso el tiempo de vida del temporal se extiende al de la referencia. Sin embargo, esto no funciona con valores devueltos o atributos de clase, por lo que necesita un objeto con nombre allí. –

+0

ofc me puedo vincular a un const &, solo que puede pasar una cadena simple como parámetro cuando la define como const & pero no solo & .. corríjame si estoy equivocado. y ¿qué quieres decir con lo último? no estoy seguro si entiendo lo que quieres decir allí – chikuba

+0

Quise decir que si usas un atributo que es un 'std :: string const &' en una clase, no puedes vincular una cadena temporal a él. –

Cuestiones relacionadas