微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C++ 中编写移动构造函数时是否必须编写复制构造函数?

如何解决在 C++ 中编写移动构造函数时是否必须编写复制构造函数?

我知道五法则,其中规定,如果您实现析构函数,则很可能还应该实现复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符。

但是,如果我实现了移动运算符,我绝对必须实现一个副本副本,还是只是最佳实践?

解决方法

“零规则”可能适用于您的情况。为什么首先要提供移动构造函数或移动赋值运算符?是因为您的类代表了某些资源的独特所有权吗?如果是这样,最好将该资源的所有权封装在 unique_ptr 成员或类似的东西中。然后,您不再需要编写移动构造函数和移动赋值运算符。编译器会自动生成它们,这将移动 unique_ptr 成员,从而转移所有权。编译器还将确保该类不可复制。

好的,但假设出于某种原因,零规则不适用于您的班级。如果你只声明一个移动构造函数会发生什么?然后,编译器将隐式禁用您的类的复制,这意味着您的类类型的对象只能从相同类型的右值初始化,而不能从左值初始化。五法则告诉你,最好明确说明这种情况,而不是让读者去猜测编译器在做什么。因此,将复制构造函数定义为 = delete;最佳实践(但不是必需的)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。