在阅读Bjarne Stroustrup的CoreCppGuidelines时,我找到了一条与我的经历相矛盾的指南.
该C.21要求如下:
如果您定义或
=delete
任何默认操作,请定义或=delete
全部
原因如下:
特殊函数的语义密切相关,因此如果需要非默认函数,则其他人也需要修改.
根据我的经验,重新定义默认操作的两种最常见情况如下:
#1:使用默认主体定义虚拟析构函数以允许继承:
class C1
{
...
virtual ~C1() = default;
}
Run Code Online (Sandbox Code Playgroud)
#2:默认构造函数的定义,对RAII类型的成员进行一些初始化:
class C2
{
public:
int a; float b; std::string c; std::unique_ptr<int> x;
C2() : a(0), b(1), c("2"), x(std::make_unique<int>(5))
{}
}
Run Code Online (Sandbox Code Playgroud)
根据我的经验,所有其他情况都很少见.
您如何看待这些例子?它们是C.21规则的例外,还是最好在这里定义所有默认操作?还有其他常见的例外吗?