为什么不调用移动构造函数?
Why is the move constructor not called?
据我了解,创建临时对象时会调用移动构造函数。这里 getA()
函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:
#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;
}
允许编译器优化实例 obj
并将对象直接发送回调用者,而无需获取概念值副本。
这叫做namedreturn价值优化(NRVO)。这是比经典 return 值优化 (RVO) 更积极的优化,编译器可以调用它来避免匿名临时值的复制。
为避免疑义,编译器可以这样做即使这样做会产生副作用(在您的情况下缺少控制台输出)。
据我了解,创建临时对象时会调用移动构造函数。这里 getA()
函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:
#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;
}
允许编译器优化实例 obj
并将对象直接发送回调用者,而无需获取概念值副本。
这叫做namedreturn价值优化(NRVO)。这是比经典 return 值优化 (RVO) 更积极的优化,编译器可以调用它来避免匿名临时值的复制。
为避免疑义,编译器可以这样做即使这样做会产生副作用(在您的情况下缺少控制台输出)。