【问题标题】:When should we write our own move constructor (move assignment operator)我们什么时候应该编写自己的移动构造函数(移动赋值运算符)
【发布时间】:2021-05-28 14:56:16
【问题描述】:

用户定义的 move constructormove assignment operator 在所有解释 move semantics 的示例中都可以省略,因为编译器生成的将完成这项工作。

我在 stackoverflow 中找到的答案不会超出“三法则”(五法则)——因此,如果一个类定义了以下任何一项,那么它可能应该明确定义所有五项。

但是对于复制构造函数和所有其他成员来说,原因是显而易见的,并且可以很容易地编写一个示例来说明如果用户定义的复制构造函数不存在会出现什么问题。

在维基百科中我们可以找到:

当对象拥有指针或不可共享的引用(例如文件)时,通常需要用户定义的复制构造函数。

所以问题是是否有示例可以显示是否真的需要用户定义的移动构造函数或移动赋值运算符,或者我可以假设在 99% 的情况下编译器生成的就足够了。

【问题讨论】:

  • 如果声明了任何复制操作,则不会生成任何移动操作。因此,您必须至少手动定义它们default
  • 正如您在rule_of_three/five/zero 中所读到的,“与三法则不同,未能提供移动构造函数和移动赋值通常不是错误,而是错过了优化机会。”

标签: c++ c++11 move-semantics


【解决方案1】:

我想一个必要的自定义移动操作的例子是一个由容器和一些指向其内容的指针组成的类的例子;比如说,一个带有头部和尾部的循环缓冲区。 但确实,这样写并不常见。

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 2020-12-03
    • 2017-01-17
    • 2017-05-15
    • 2012-04-15
    • 2020-09-06
    • 1970-01-01
    • 2013-11-18
    • 2015-07-10
    相关资源
    最近更新 更多