Bal*_*n K 26 c++ move-semantics c++11
struct copyable { // and movable
copyable() = default;
copyable(copyable const&) { /*...*/ };
copyable& operator=(copyable const&) { /*...*/ return *this; }
};
Run Code Online (Sandbox Code Playgroud)
由于复制构造函数和复制赋值操作函数是显式定义的,因此它表示编译器不能隐式定义移动构造函数和移动赋值函数,因此不允许移动操作.
能告诉我上述理解是否正确吗?
son*_*yao 31
它表示编译器无法隐式定义移动构造函数和移动赋值函数
恩,那就对了.
因此不允许移动操作.
不,移动操作仍然可以通过复制构造函数和复制赋值运算符执行(尽管可能不是您预期的情况),因为rvalue总是可以绑定到const&.
更确切地说,类copyable仍然是MoveConstructible和MoveAssignable.
类不必实现移动构造函数来满足此类型要求:采用const T&argument的复制构造函数可以绑定rvalue表达式.
如果MoveConstructible类实现了移动构造函数,它还可以实现移动语义,以利用构造后的rv值未指定的事实.
和
该类型不必实现移动赋值运算符以满足此类型要求:通过值或作为const Type&获取其参数的复制赋值运算符将绑定到rvalue参数.
如果MoveAssignable类实现了移动赋值运算符,它还可以实现移动语义,以利用赋值后的rv值未指定的事实.
正如@Curious指出的那样,你可以声明移动构造函数并显式移动赋值运算符delete以使其copyable不可移动; 然后使用rvalue表达式选择deleteed重载并且编译失败.
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |