【发布时间】:2015-03-31 18:23:30
【问题描述】:
我想知道 C++03 和 C++11 何时调用 temporay 的析构函数
假设我有以下情况
foo method()
{
foo f;
......
......
return foo;
}
void doSomething()
{
foo f = method();
....
}
假设我正在使用标志-fno-elide-constructors,因为我想从理论上了解何时调用临时的析构函数。
因此,当method() 完成时,C++03 中的上述代码将使用其复制构造函数制作foo 的副本。之后在语句foo f = method() 处再次调用foo 的复制构造函数。 在这种情况下,对于 C++03,何时调用这个临时对象(由 method 传递)的析构函数? 它是在 doSomething() 范围的末尾调用的吗?
现在我想将相同的情况应用于涉及移动语义的 C++11。在 C++11 的情况下,当 method 返回 foo 的副本时。然后当调用 foo f = method() 时,调用 foo 的移动构造函数。 那么在 C++11 的情况下,何时调用从 method() 返回的临时对象的析构函数?
【问题讨论】:
-
这里的C++11和C++03中的临时对象被销毁的方式完全一样。您的示例中唯一的区别是在 C++03 中调用了
foo(const foo&),而在 C++11 中有时调用了foo(foo&&)。