为什么不调用移动构造函数?

时间:2016-07-07 13:31:01

标签: c++ c++11 move

根据我的理解,当创建临时对象时,将调用移动构造函数。这里#include <iostream> using namespace std; class A { public: A() { cout<<"Hi from default\n"; } A(A && obj) { cout<<"Hi from move\n"; } }; A getA() { A obj; cout<<"from getA\n"; return obj; } int main() { A b(getA()); return 0; } 函数返回一个临时对象,但我的程序没有从移动构造函数中打印消息:

{{1}}

1 个答案:

答案 0 :(得分:9)

允许编译器优化实例obj并将对象直接发送回调用者,而不会进行概念值复制。

这称为命名返回值优化(NRVO)。这是一个比传统返回值优化(RVO)更积极的优化,编译器可以调用它来避免匿名临时值的副本。

为避免疑问,编译器可以执行此操作即使这样做会产生副作用(在您的情况下缺少控制台输出)。