In some cases, it is necessary for the compiler to create temporary objects. These temporary objects can be created for the following reasons:
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.
Because the return value is not copied to another object, a temporary object is created. A more common case where temporaries are created is during the evaluation of an expression where overloaded operator functions must be called. These overloaded operator functions return a user-defined type that often is not copied to another object.
Consider the expression ComplexResult = Complex1 + Complex2 + Complex3
. The expression Complex1 + Complex2
is evaluated, and the result is stored in a temporary object. Next, the expression temporary + Complex3
is evaluated, and the result is copied to ComplexResult
(assuming the assignment operator is not overloaded).
Temporary objects have a lifetime that is defined by their point of creation and the point at which they are destroyed. Any expression that creates more than one temporary object eventually destroys them in the reverse order in which they were created. The points at which destruction occurs are shown in Table 11.3.
Table 11.3 Destruction Points for Temporary Objects
Reason Temporary Created | Destruction Point |
Result of expression evaluation |
All temporaries created as a result of expression evaluation are destroyed at the end of the expression statement (that is, at the semicolon), or at the end of the controlling expressions for for, if, while, do, and switch statements. |
Result of expressions using the built-in (not overloaded) logical operators (|| and &&) |
Immediately after the right operand. At this destruction point, all temporary objects created by evaluation of the right operand are destroyed. |
Initializing const references | If an initializer is not an l-value of the same type as the reference being initialized, a temporary of the underlying object type is created and initialized with the initialization expression. This temporary object is destroyed immediately after the reference object to which it is bound is destroyed. |