When creating a new instance of a MyClass as an argument to a function like so:
class MyClass
{
MyClass(int a);
};
myFunction(MyClass(42));
Does the standard make any guarantees on the timing of the destructor?
Specifically, can I assume that it is going to be called before the next statement after the call to myFunction() ?
Temporary objects are destroyed at the end of the full expression they’re part of.
A full expression is an expression that isn’t a sub-expression of some other expression. Usually this means it ends at the
;(or)forif,while,switchetc.) denoting the end of the statement. In your example, it’s the end of the function call.Note that you can extend the lifetime of temporaries by binding them to a
constreference. Doing so extends their lifetime to the reference’s lifetime:If you don’t plan to change the returned object, then this is a nice trick to save a copy constructor call (compared to
MyClass obj = getMyClass();), in case return value optimization was not being applied. Unfortunately it isn’t very well known. (I suppose C++11’s move semantics will render it less useful, though.)