Objetos temporales

Un objeto temporal es un objeto sin nombre creado por el compilador para almacenar un valor temporal.

Comentarios

En algunos casos, es necesario que el compilador cree objetos temporales. Estos objetos temporales se pueden crear por las razones siguientes:

  • Para inicializar una referencia const con un inicializador de un tipo diferente del tipo subyacente de la referencia que se va a inicializar.

  • Para almacenar el valor devuelto de una función que devuelve un tipo definido por el usuario (UDT). Estos objetos temporales solo se crean si el programa no copia el valor devuelto en un objeto. Por ejemplo:

    UDT Func1();    //  Declare a function that returns a user-defined
                    //   type.
    
    ...
    
    Func1();        //  Call Func1, but discard return value.
                    //  A temporary object is created to store the return
                    //   value.
    

    Como el valor devuelto no se copia en otro objeto, se crea un objeto temporal. Un caso más común de creación de objetos temporales es durante la evaluación de una expresión en la que deben llamarse a funciones de operador sobrecargadas. Estas funciones de operador sobrecargadas devuelven un tipo definido por el usuario que normalmente no se copia a otro objeto.

    Considere la expresión ComplexResult = Complex1 + Complex2 + Complex3. La expresión Complex1 + Complex2 se evalúa y el resultado se almacena en un objeto temporal. A continuación, se evalúa la expresión + Complex3temporary y el resultado se copia en ComplexResult (suponiendo que el operador de asignación no esté sobrecargado).

  • Para almacenar el resultado de una conversión en un tipo definido por el usuario. Cuando un objeto de un tipo determinado se convierte explícitamente en un tipo definido por el usuario, este nuevo objeto se crea como un objeto temporal.

Los objetos temporales tienen una duración que viene definida por su punto de creación y por el punto en el que se destruyen. Cualquier expresión que cree más de un objeto temporal los acabará destruyendo en el orden inverso en que se crearon.

Cuando se produce la destrucción de un objeto temporal, depende de cómo se use:

  • Objetos temporales usados para inicializar referencias const:
    Si un inicializador no es un valor L del mismo tipo que la referencia que se va a inicializar, se crea un objeto temporal del tipo de objeto subyacente. Se inicializa mediante la expresión de inicialización. Este objeto temporal se destruye inmediatamente después de que se destruya el objeto de referencia al que está enlazado. Como esta destrucción puede ocurrir mucho después de la expresión que creó el objeto temporal, a veces se conoce como extensión de duración.

  • Los objetos temporales creados como efecto de la evaluación de expresiones:
    Todos los objetos temporales que no encajen en la primera categoría y que se creen como resultado de la evaluación de la expresión se destruyen al final de la instrucción de expresión (es decir, en el punto y coma) o al final de las expresiones de control en el caso de las instrucciones for, if, while, do y switch.

Consulte también

Blog de Herb Sutter en References, simply