默认移动构造函数

时间:2015-03-12 09:56:00

标签: c++ c++11

我有一个像

这样的课程
class MyMatrix {
public:
    MyMatrix() = default;
    MyMatrix(const MyMatrix&) = default;
    ~MyMatrix() = default;

    // some custom methods..

private:
   std::vector<float> data;
}

因为我将所有数据都放在载体中,所以我认为RAI​​I应该处理内存。

我的问题是:我是否还应该添加MyMatrix(MyMatrix&&) = default;行?我的代码会从中受益吗,或者如果我这样做,我会做错吗?

2 个答案:

答案 0 :(得分:7)

当您提供用户声明的复制构造函数(或复制赋值运算符)时,移动构造函数移动赋值运算符都不是声明。

MyMatrix(const MyMatrix&) = default; // <- though `defaulted`, it *is* user-declared...

如果您希望您的课程从移动语义中受益,那么您需要自己声明它们(您仍然可以默认它们)。由于您只有成员具有良好定义的复制和移动语义(向量),因此默认实现将是正常的。

MyMatrix(MyMatrix&&) = default;

添加该声明将导致复制赋值运算符的自动删除。如果你想要它,你也必须声明它!

最后,您可以删除复制构造函数的声明,它将按照您希望的方式执行。 (您还可以自动默认为移动和复制分配操作员)。

这是Howard Hinnant关于此问题的slideshare(有漂亮的表格),向您展示编译器生成的内容 - 或者不是 - 取决于您声明的内容。

答案 1 :(得分:3)

应该做什么,是这样的:

class MyMatrix {
public:
   // some custom methods..

private:
   std::vector<float> data;
};

当您不自行声明任何特殊成员函数时,所有这些默认特殊成员函数都将被隐式定义。