c ++语法:默认和删除修饰符

djf*_*djf 9 c++ c++11

今天我偶然发现了一个像这样的代码片段:

class A 
{
    A() = default;
    A (const A&) = delete; 

    ...
}
Run Code Online (Sandbox Code Playgroud)

我从未见过deletedefault关键字.它们是C++ 11标准的一部分吗?它们用于什么?

Ker*_* SB 11

现在可以默认删除特殊成员函数.

删除的成员函数仍然参与重载解析,但如果选择它,则程序格式错误,编译停止并带有有用的诊断.这是编写非可复制类等内容的正确方法,用户会收到正确的错误消息.

默认的成员函数"做它应该做的",例如默认的默认构造函数默认初始化所有基数和成员并且具有空体; 默认的复制构造函数复制每个基础和成员对象,默认的赋值运算符分配每个基础和成员对象.如果不允许任何这些操作(例如,您有引用成员),则默认成员函数被定义为已删除.

请注意,您的第一个声明定义A() = default;使构造函数A::A() 用户声明但不是用户定义的 ; 这对于分类很重要A,例如它是否是POD.(而且注意,这不同于struct A { A(); }; A::A() = default;用户定义的.)

另一个很好的结果是隐式生成的东西的澄清:如果你根本不自己编写某些函数(比如复制构造函数),就会为你隐式声明.当隐式声明的一个被odr使用时,它被隐式定义为默认,因此如果它不可能(例如,如果该类具有不可复制的成员),它实际上被隐式定义为已删除.因此,这通常是传播诸如不可复制性和不可分配性之类的简洁方式,至少在语言和随后的诊断方面.