【问题标题】:c++ syntax: default and delete modifiersc++ 语法:默认和删除修饰符
【发布时间】:2013-05-27 09:48:37
【问题描述】:

今天我偶然发现了一个像这样的代码 sn-p:

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

    ...
}

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

【问题讨论】:

标签: c++ c++11


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我认为你实际上可以使用引用成员默认一个类的赋值运算符 - 但是,赋值运算符随后被定义为“已删除” - 如果你让编译器会发生同样的事情生成它。
  • @Xeo:啊,是的,这更有意义。谢谢!已编辑。
猜你喜欢
  • 2011-04-13
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2012-03-03
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多