我测试了这段代码,看看编译器会自动将临时对象传输到变量,而不需要移动构造函数。
#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;
}
此代码打印“Hi from default from getA”,而不是假定的“Hi from move”
在优化方面,它很棒。但是,如何在不添加副本的情况下强制调用移动构造函数?(如果我想要临时对象的特定行为)
补充问题:我认为,如果我没有编写移动构造函数,那么每次我将右值分配给左值时都会有一个副本(就像在该行的代码中一样A b(getA());
)。既然情况并非如此,而且编译器似乎做得很好,那么实现移动语义什么时候真正有用?