1. 出现条件
只有当一个类没有定义任何自己版本的拷贝控制成员,且类的每个非 static 数据成员都可以移动,编译器才会为它合成构造函数或移动赋值运算符。
struc X{
int i;
std::string s;
};
struc HasX{
X mem;
};
X x, x2 = std::move(x);
HasX hx, hx2 = std::move(hx);
2. 说明
如果类的一个成员是类类型,且该类有对应的移动操作,编译器也能移动这个成员。
3.不出现的条件
如果一个类只有拷贝构造函数,而没有移动构造函数,在这种情况下,编译器不会合成移动构造函数,函数的匹配规则会保证该类型的对象会被拷贝。
class Foo{
public:
Foo() = default;
Foo(const Foo &) ;//拷贝构造函数
//其他成员的定义,但Foo为定义移动构造函数
};
Foo x;
Foo y(x);//拷贝构造函数x是一个左值
Foo z(std::move(x));//拷贝构造函数,因为未定义移动构造函数