隐式声明的移动赋值运算符

时间:2018-03-19 14:20:11

标签: c++11 move

我无法从cpp引用中了解这个简单的规则;

  

如果没有为类提供用户定义的移动赋值运算符   type(struct,class或union),以下所有内容均为true:

     

没有用户声明的副本构造函数;

     

没有用户声明的移动构造函数;

     

没有用户声明的复制赋值运算符;

     

没有用户声明的析构函数;

     

不会定义隐式声明的移动赋值运算符   删除后,(直到C ++ 14)

     

然后编译器声明一个移动赋值运算符作为其类的内联公共成员,并带有签名T& T ::运算符=(T&安培;&安培)。

考虑到这一点,请考虑

struct bar
{

   bar(int i) : _i(i) {};
   bar (const bar& other) { };
   bar (bar& other) { };

   int _i;
};

接下来,说;

   bar b2(2);
   bar b3(3);
   cout << "b3._i " << b3._i << endl << endl;
   b3 = std::move(b2);
   cout << "b3._i " << b3._i << endl;

我们获得的输出是;

b3._i 3

b3._i 2

所以这里我们有一个举动;

b3 = std::move(b2);

我没有定义移动赋值运算符,因此编译器已经为我隐式定义了它。但是我已经打破了规定的条件,我有一个用户定义的复制ctor ....但是仍然有一个由编译器生成的移动。我明显误解了文本,任何人都可以这么好开导我吗?

谢谢你,祝你有个愉快的一天。

1 个答案:

答案 0 :(得分:3)

  

所以这里我们有一个举动;

b3 = std::move(b2);

不,这是副本。 std::move(b2)只是将b2投射到bar&&。然后bar&&绑定到隐式生成的复制赋值运算符中的const bar&

live example on wandbox