此前:
我们知道只有特殊的成员函数可能是默认的,但是任何函数都可以删除。
[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年的差距或一些理由解释了这一点?
答案 0 :(得分:4)
因为只有特殊的成员函数才有明确定义的&#34;默认&#34;定义,如果你没有声明函数或任何其他会阻止它的函数,则会隐式生成。
如果我要写
int f() = default;
你期望这个功能做什么?
答案 1 :(得分:1)
逻辑根本没有改变,只有措辞。看看原来的
&#34; = default;&#34;的函数定义,称为显式默认定义,完全具有隐式默认定义的实现
只有特殊的成员函数具有&#34;隐式默认定义&#34;。试图明确地默认任何其他函数是不明确的,因为它是根据不存在的东西(隐式默认定义)定义的。