根据我的理解,当创建临时对象时,将调用移动构造函数。这里#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}}
答案 0 :(得分:9)
允许编译器优化实例obj
并将对象直接发送回调用者,而不会进行概念值复制。
这称为命名返回值优化(NRVO)。这是一个比传统返回值优化(RVO)更积极的优化,编译器可以调用它来避免匿名临时值的副本。
为避免疑问,编译器可以执行此操作即使这样做会产生副作用(在您的情况下缺少控制台输出)。