我无法从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 ....但是仍然有一个由编译器生成的移动。我明显误解了文本,任何人都可以这么好开导我吗?
谢谢你,祝你有个愉快的一天。
答案 0 :(得分:3)
所以这里我们有一个举动;
b3 = std::move(b2);
不,这是副本。 std::move(b2)
只是将b2
投射到bar&&
。然后bar&&
绑定到隐式生成的复制赋值运算符中的const bar&
。