c++ 为什么不从函数中调用返回的对象的析构函数?

我在想,当函数将堆栈上的一个对象返回给调用函数时,调用函数会获取原始对象的副本,但是一旦堆栈解开就会调用原始对象的析构函数.但是在下面的程序中,析构函数只被调用一次.我预计会被召两次.

#include <iostream>

class MyClass
{
public:
  ~MyClass() { std::cout << "destructor of MyClass" << std::endl; }
};

MyClass getMyClass()
{
  MyClass obj = MyClass();
  return obj;   // dtor call for obj here?
}

int main()
{
  MyClass myobj = getMyClass();
  return 0;  // Another dtor call for myobj.
}

但是“MyClass的析构函数”只能打印一次.我的假设是错误的还是在这里有其他的事情?

这是一个特殊情况,允许编译器优化副本:这被称为named return value optimization(NRVO).基本上,编译器为调用站点上的返回对象分配内存,并使函数直接填充该内存,而不是在被调用站点创建对象并将其复制回来.现代编译器每当有可能时都会这样做(有些情况并不容易,因为在返回不同实例的函数中有几个返回路径).
代码日志版权声明:
翻译自:http://stackoverflow.com/questions/697868/why-is-the-destructor-not-called-for-the-returned-object-from-the-function

转载注明原文:c++ 为什么不从函数中调用返回的对象的析构函数?