我有一个像
这样的课程class MyMatrix {
public:
MyMatrix() = default;
MyMatrix(const MyMatrix&) = default;
~MyMatrix() = default;
// some custom methods..
private:
std::vector<float> data;
}
因为我将所有数据都放在载体中,所以我认为RAII应该处理内存。
我的问题是:我是否还应该添加MyMatrix(MyMatrix&&) = default;
行?我的代码会从中受益吗,或者如果我这样做,我会做错吗?
答案 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;
};
当您不自行声明任何特殊成员函数时,所有这些默认特殊成员函数都将被隐式定义。