10

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

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

    ...
}

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

4

1 回答 1

12

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

被删除的成员函数仍然参与重载决议,但如果它被选中,则程序格式错误并且编译停止并显示有用的诊断信息。这是编写不可复制类之类的正确方法,并且用户会收到正确的错误消息。

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

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

另一个很好的结果是对隐式生成的东西的澄清:如果您根本不自己编写某些函数(例如复制构造函数),则会为您隐式声明一个函数。当隐式声明的一个被 odr 使用时,它被隐式定义为默认值,因此如果它不可能(例如,如果类具有不可复制的成员),它实际上被隐式定义为 deleted。所以这通常是一种传播诸如不可复制性和不可分配性之类的巧妙方法,至少在语言和随之而来的诊断方面是这样。

于 2013-05-27T09:53:51.080 回答