¿Cuál es la vida útil de los argumentos de funciones temporales? [duplicar]

Resuelto shoosh asked hace 14 años • 4 respuestas

Al crear una nueva instancia de a MyClasscomo 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()?

shoosh avatar Mar 24 '10 17:03 shoosh
Aceptado

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.whileswitch

Tenga en cuenta que puede ampliar la vida útil de los temporales vinculándolos a una constreferencia. 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).

sbi avatar Mar 24 '2010 10:03 sbi

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++.

Steve Jessop avatar Mar 24 '2010 11:03 Steve Jessop