¿Cuál es la vida útil de los argumentos de funciones temporales? [duplicar]
Al crear una nueva instancia de a MyClass
como argumento para una función de esta manera:
class MyClass
{
MyClass(int a);
};
myFunction(MyClass(42));
¿La norma ofrece alguna garantía sobre el momento del destructor?
Específicamente, ¿puedo asumir que se llamará antes de la siguiente declaración después de la llamada a myFunction()
?
Los objetos temporales se destruyen al final de la expresión completa de la que forman parte.
Una expresión completa es una expresión que no es una subexpresión de alguna otra expresión. Por lo general , esto significa que termina en ;
(o )
for if
, etc.) que indica el final de la declaración. En su ejemplo, es el final de la llamada a la función.while
switch
Tenga en cuenta que puede ampliar la vida útil de los temporales vinculándolos a una const
referencia. Al hacerlo, se extiende su vida útil a la vida útil de la referencia:
MyClass getMyClass();
{
const MyClass& r = getMyClass(); // full expression ends here
...
} // object returned by getMyClass() is destroyed here
Si no planea cambiar el objeto devuelto, entonces este es un buen truco para guardar una llamada al constructor de copia (en comparación con MyClass obj = getMyClass();
), en caso de que no se estuviera aplicando la optimización del valor de retorno. Lamentablemente no es muy conocido. (Sin embargo, supongo que la semántica de movimiento de C++ 11 lo hará menos útil).
Todo el mundo ha citado correctamente 12.2/3 o similar, lo que responde a su pregunta:
Los objetos temporales se destruyen como último paso en la evaluación de la expresión completa que (léxicamente) contiene el punto donde fueron creados.
Me parece divertido que en la siguiente página de mi impresión del estándar, 12.2/4 diga:
Hay dos contextos en los que los temporales se destruyen en un punto diferente al final de la expresión completa.
Ninguno de ellos se aplica a su ejemplo, ambos se relacionan con el uso de temporales en los inicializadores. Pero sí demuestra que hay que mantener el ingenio cuando se trata de una bestia engañosa como el estándar C++.