今天我偶然发现了一个像这样的代码片段:
class A
{
A() = default;
A (const A&) = delete;
...
}
Run Code Online (Sandbox Code Playgroud)
我从未见过delete或default关键字.它们是C++ 11标准的一部分吗?它们用于什么?
Ker*_* SB 11
现在可以默认或删除特殊成员函数.
删除的成员函数仍然参与重载解析,但如果选择它,则程序格式错误,编译停止并带有有用的诊断.这是编写非可复制类等内容的正确方法,用户会收到正确的错误消息.
默认的成员函数"做它应该做的",例如默认的默认构造函数默认初始化所有基数和成员并且具有空体; 默认的复制构造函数复制每个基础和成员对象,默认的赋值运算符分配每个基础和成员对象.如果不允许任何这些操作(例如,您有引用成员),则默认成员函数被定义为已删除.
请注意,您的第一个声明定义A() = default;使构造函数A::A() 用户声明但不是用户定义的 ; 这对于分类很重要A,例如它是否是POD.(而且注意,这不同于struct A { A(); }; A::A() = default;其是用户定义的.)
另一个很好的结果是隐式生成的东西的澄清:如果你根本不自己编写某些函数(比如复制构造函数),就会为你隐式声明.当隐式声明的一个被odr使用时,它被隐式定义为默认,因此如果它不可能(例如,如果该类具有不可复制的成员),它实际上被隐式定义为已删除.因此,这通常是传播诸如不可复制性和不可分配性之类的简洁方式,至少在语言和随后的诊断方面.
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |