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));//拷贝构造函数,因为未定义移动构造函数