为什么不为定义析构函数为= default的类合成移动操作?

Alw*_*ing 7 c++ c++11

编译器不应该为声明析构函数或复制操作(即复制构造函数/赋值)的类合成移动操作的规则是有意义的.毕竟,通过宣布这些操作,该课程承认它需要做一些自定义簿记.

但是,当类将析构函数或复制操作定义为=default?时,这种推理不适用?那么这种情况不应该是规则的例外吗?

编辑:我可能想要将析构函数定义为=default但不是其他特殊操作的一个原因是当我需要基类的虚拟析构函数时,所以我被迫定义一个使其成为虚拟的.

Jon*_*ely 2

我认为部分原因是,如果您编写了默认析构函数,那么您已经在编写(至少)C++11,因此您没有理由不能编写默认移动构造函数和移动赋值操作员。

该规则可防止 C++11 之前编写的类被默默地赋予可能破坏类不变量的移动语义。如果该类不是 C++11 之前的类,那么您可以明确决定是否要移动语义并使用=default.

  • 正如 Python 禅宗所说,显式优于隐式。添加这几个标记几乎不会增加冗长性。 (2认同)