【问题标题】:Are move constructors produced automatically?移动构造函数是自动生成的吗?
【发布时间】:2012-01-07 04:31:52
【问题描述】:

我有一个很大的班级,里面有很多 STL 容器。
编译器会自动创建一个移动构造函数,将这些容器移动到目标,还是我必须自己创建?

【问题讨论】:

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


    【解决方案1】:

    X 类的移动构造函数在何时被隐式声明为默认值

    • X 没有用户声明的复制构造函数,
    • X 没有用户声明的复制赋值运算符,
    • X 没有用户声明的移动赋值运算符,
    • X 没有用户声明的析构函数,并且
    • 移动构造函数不会被隐式定义为已删除。

    例如,如果你的类有一个没有移动构造函数的类类型数据成员,即使它没有声明任何复制/移动构造函数,你的类也不会得到移动构造函数,因为隐式声明move 构造函数将被定义为已删除(因为该数据成员)。

    【讨论】:

    • 有趣的是,用户声明的移动构造函数不会阻止编译器隐式声明复制构造函数。也许,这里值得一提。至少cprogramming.com/c++11/… 是这么说的。
    • 有趣的是,所有成员都需要有一个移动构造函数。移动所有可以移动的成员并复制不能移动的成员似乎很明智。
    • 所以最好的办法是自己定义move ctor,不要依赖编译器。
    • 并且上述类成员不会有隐式移动构造函数,因为上面列表中的一个或多个项目没有得到满足。
    • @KevinCox 通常保证移动构造函数不会抛出异常,而复制构造函数通常可以(例如内存不足),因此这可能不是一个好主意。您可能会争辩说“没关系,隐式移动构造函数不会是 noexcept”,但我仍然认为可能会出现意外(即错误)。
    【解决方案2】:

    默认移动构造函数通常与默认复制构造函数绑定。当你得到另一个时,你得到一个。但是,如果您编写复制构造函数/赋值运算符,则不会编写默认的复制 移动构造函数/赋值运算符。如果你写其中任何一组,你必须把它们都写出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2011-08-21
      • 2014-11-08
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多