2012-07-19 18 views
53

Duplicar posibles:
Does a const reference prolong the life of a temporary?objeto temporal y vinculante para referencia constante

Mi compilador no se queja acerca de la asignación temporal de referencia constante:

string foo() { 
    return string("123"); 
}; 

int main() { 
    const string& val = foo(); 
    printf("%s\n", val.c_str()); 
    return 0; 
} 

Por qué ? Pensé que la cadena devuelta desde foo es temporal y val puede señalar al objeto cuya duración ha finalizado. ¿Lo permite el estándar C++ y prolonga la vida útil del objeto devuelto?

+4

Sí, la vida útil temporal se prolonga siempre que se trate de una referencia ** const **. – chris

+2

Eso no es exactamente un duplicado de 2784262, que (debería) tratar el caso donde la referencia es un miembro de la clase. El comportamiento es diferente. – aberaud

+1

@aberaud no solo no es un duplicado, es una pregunta mucho mejor que estoy contento de haber encontrado. – dashesy

Respuesta

66

Esta es una característica de C++. El código es válido y hace exactamente lo que parece hacer.

Normalmente, un objeto temporal solo dura hasta el final de la expresión completa en la que aparece. Sin embargo, C++ especifica deliberadamente que vincular un objeto temporal a una referencia a const en la pila alarga la vida útil del temporal a la duración de la propia referencia, y evita así lo que de otro modo sería un error común de referencia colgante. En el ejemplo anterior, el temporal devuelto por foo() vive hasta la llave de cierre.

P.S: Esto solo se aplica a las referencias basadas en pila. No funciona para referencias que son miembros de objetos.

Texto completo: GotW #88: A Candidate For the “Most Important const” by Herb Sutter.

+2

Además, tenga en cuenta que si no se realiza una copia en la cadena aquí, debe existir un constructor de copia para la cadena y ser accesible. – xryl669

+0

con ** PS **, esto es muy importante, y el enlace de SO dupe SO arriba tiene buenas ilustraciones de este –

+0

@ xryl669 Hace [C++ 17 copia elision garantizada] (http: //www.open-std. org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html) ¿significa que el constructor de copia ya no es necesario? quote: '' 'cuando el objeto fuente es un' '' – dashesy

Cuestiones relacionadas