【发布时间】:2017-12-11 07:13:21
【问题描述】:
http://en.cppreference.com/w/cpp/language/rule_of_three
几个月前我开始使用 c++11 并且看过五法则。
所以..我开始在每个具有虚拟析构函数的类上放置带有默认关键字的复制构造函数/复制赋值运算符/移动构造函数/移动赋值运算符。
因为规则告诉我,如果您声明显式析构函数,那么您的类将不再具有其隐式移动构造函数和移动赋值运算符。
所以我认为 gcc 会因为缺少移动构造函数和移动赋值运算符而向我抱怨低于类。
但是效果很好!发生了什么??
class Interface {
public:
virtual ~Interface() = default; // implicit destructor
};
class ImplA : public Interface {
public:
virtual ~ImplA() = default; // implicit destructor
};
ImplA first;
ImplA second(first); // copy constructor, OK. understood it.
ImplA third(std::move(first)); // move constructor, it's OK. Why?
second = first; // copy assignment, OK. understood it.
second = std::move(first); // move assignment, it's also OK. Why?
【问题讨论】:
-
看看move ctor,“已删除隐式声明的移动构造函数”部分,您的类不满足其中列出的任何条件。
-
一切正常。
=default析构函数等同于隐式析构函数,因此这些类不计入规则 5 中提到的user-defined析构函数。 -
5 规则是一个指导原则。这是因为它经常被需要,而不是因为你应该总是这样做。如果您的虚拟析构函数只是为了使您的类型具有多态性(如您的示例中的情况),则无需创建其他方法,因此。
-
@K.Kirsz 这与参考文献(和 C++ 标准)中的陈述相矛盾。
-
@jay 你的析构函数不是 user-provided 但仍然是user-declared;这意味着编译器不会隐式声明任何移动构造函数和赋值运算符。请参阅链接的“隐式声明的移动构造函数”部分。
标签: c++ c++11 move-semantics