【发布时间】:2014-09-04 11:47:51
【问题描述】:
在C++11中,如果基类已经定义了自己的移动(复制)构造函数(赋值运算符),那么它的子类是否需要在调用基类的地方定义自己的移动(复制)构造函数(赋值运算符)?相应的构造函数/操作符是否被显式调用?
每次都明确定义构造函数、析构函数、移动/复制构造函数(赋值运算符)是不是一个好主意?
struct Base {
Base() {}
Base(Base&& o);
};
struct Sub : public Base {
Sub(Sub&& o) ; // Need I do it explicitly ? If not,what the compiler will do for me
};
【问题讨论】:
-
如果您没有任何移动构造函数,编译器将生成一个默认的移动构造函数,但并非总是如此(参见例如this reference for a list of when it's not created)。但是,您不能依赖默认的移动(或任何其他)构造函数来“做正确的事情”,尤其是不能依赖基类移动构造函数,因为它不知道任何子类。另请阅读the rule of three (or five since C++11)。
-
@Puppy 我会说三规则和零规则相互补充,而不是排除或取代另一个。仅仅因为您可以对某些课程遵循零规则,并不意味着您可以(或应该)对所有课程都这样做。
-
哦,参考 OP(和其他好奇)here's the rule of zero。
-
从实际的角度来看,截至目前(2014 年),许多 C++11 模式下的编译器(尤其是 MSVC)无法正确生成默认移动构造函数,因此最好始终编写自己的.
-
@c.r.许多?我知道有一个(MSVC)假装是 C++11,但缺少它。
标签: c++ c++11 move-semantics