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

C++ c++;语法:默认和删除修饰符,c++,c++11,C++,C++11,今天,我无意中发现了一个类似这样的代码片段: class A { A() = default; A (const A&) = delete; ... } 我从未见过delete或default关键字。它们是C++11标准的一部分吗?它们的用途是什么?现在可以默认或删除特殊成员函数 已删除的成员函数仍然参与重载解析,但如果选择该函数,则程序的格式将不正确,编译将停止并进行有用的诊断。这是编写不可复制类之类的内容的正确方法,用户会收到正确的错误消息 默认的成员

今天,我无意中发现了一个类似这样的代码片段:

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

    ...
}

我从未见过delete或default关键字。它们是C++11标准的一部分吗?它们的用途是什么?

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

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

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

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


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

它们是C++11中引入的特性。它们允许显式禁用函数的使用或指示编译器使用默认构造函数。检查。是的。8.4.2和8.4.3.@Morwenn+1的可能重复例如,我认为您实际上可以默认具有引用成员的类的赋值运算符-但是,赋值运算符随后被定义为“已删除”-如果您让编译器生成它,会发生同样的情况。@Xeo:啊,是的,这更有意义。谢谢编辑。