为什么可以删除任何功能,但只能删除默认的特殊成员功能?

时间:2014-12-01 17:23:03

标签: c++ c++11 standards

此前:

我们知道只有特殊的成员函数可能是默认的,但是任何函数都可以删除。

N3337

[dcl.fct.def.default]

  

表单的函数定义:

     

属性说明符-SEQ <子>选择    decl-specifier-seq opt 声明符 = default;

     

称为显式默认定义。一个功能   明确默认

     

- 是一个特殊的会员功能,

     

- 具有相同的声明函数类型(可能不同的除外)    ref-qualifiers ,除了在复制构造函数或复制赋值运算符的情况下,参数类型可以是“引用   非const T“,其中T是成员函数类的名称)   好像它已被隐式声明,并且

     

- 没有默认参数。

[dcl.fct.def.delete]

  

表单的函数定义:

     

属性说明符-SEQ <子>选择    decl-specifier-seq opt 声明符 = delete;

     

称为已删除的定义。具有已删除定义的函数   也称为已删除的功能

我的问题是,为什么会这样?如果标准可以允许删除任何功能,我没有看到允许任何功能被默认的危害。 n2210的措辞似乎意味着允许违约的自由职能。例如,

Changes to the Standard下,它说:

  

[...]

     

添加新的第7段。

     
    

“= default;”的函数定义,称为显式默认定义,完全具有隐式默认值的实现     定义(12.1,12.4,12.8)。 [注意:成员函数     必须在类定义之外明确默认定义     也可以在类定义中声明。 - 结束记录]与。不同     隐式默认定义,显式默认定义     可能是非内联的。 [...]

  

3年后,N3025已经建立了类似于最终草案的语言,并明确地将默认函数限制为特殊成员函数。是否有一篇论文在3年的差距或一些理由解释了这一点?

2 个答案:

答案 0 :(得分:4)

因为只有特殊的成员函数才有明确定义的&#34;默认&#34;定义,如果你没有声明函数或任何其他会阻止它的函数,则会隐式生成。

如果我要写

int f() = default;

你期望这个功能做什么?

答案 1 :(得分:1)

逻辑根本没有改变,只有措辞。看看原来的

  

&#34; = default;&#34;的函数定义,称为显式默认定义,完全具有隐式默认定义的实现

只有特殊的成员函数具有&#34;隐式默认定义&#34;。试图明确地默认任何其他函数是不明确的,因为它是根据不存在的东西(隐式默认定义)定义的。