C++ 语法 : default and delete modifiers

标签 c++ c++11

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

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

    ...
}

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

最佳答案

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

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

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

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

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

关于C++ 语法 : default and delete modifiers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16770492/

相关文章:

c++ - 重载本地 lambda 函数

c++ - Qt - 从回调中发出信号

c++ - 从文件读取时如何跳过数组的第一行?

c++ - 如何在C++模板中调用静态数组的析构函数?

c++ - 将编译时定义大小的数组初始化为常量表达式

c++ - new char 实际上是否保证了类类型的对齐内存?

C++ vector::clear

c++ - 扩展枚举类型

c++ - 如何在C++中记录用户定义的POD结构

c++ - 简化可变参数模板 : Remove some specializations