Temporary objects
Line 15 begins the call to f(h),
this time ignoring the return value. You can see in line 16 that the
copy-constructor is called just as before to pass the argument in. And also, as
before, line 21 shows the copy-constructor is called for the return value. But
the copy-constructor must have an address to work on as its destination (a
this pointer). Where does this address come
from?
It turns out the compiler can create a
temporary object whenever it needs one to properly evaluate an expression. In
this case it creates one you don’t even see to act as the destination for
the ignored return value of f( ). The lifetime of this temporary
object is as short as possible so the landscape
doesn’t get cluttered up with temporaries waiting to be destroyed and
taking up valuable resources. In some cases, the temporary might immediately be
passed to another function, but in this case it isn’t needed after the
function call, so as soon as the function call ends by calling the destructor
for the local object (lines 23 and 24), the temporary object is destroyed (lines
25 and 26).
Finally, in lines 28-31, the h2
object is destroyed, followed by h, and the object count goes correctly
back to
zero.