C++ Primer 5th笔记(chap 13 拷贝控制)合成的移动操作

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

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/113876089