为什么可以删除任何函数,而只能删除默认的特殊成员函数

Why can you delete any function, but only default special member functions?

本文关键字:函数 删除 默认 成员 任何 为什么      更新时间:2023-10-16

以前:

  • 是否可以删除(或默认(非特殊C++成员函数?

  • 任何函数都可以是已删除的函数吗?

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

N3337:

[dcl.fct.def.default]

表单的函数定义:

             属性说明符-seqoptdecl-specifier-seqoptdeclarator = default ;

称为显式默认定义。一个函数,即 明确违约应

— 成为特殊成员函数,

— 具有相同的声明函数类型(除了可能不同的 ref 限定符,除了在复制构造函数或复制赋值运算符的情况下,参数类型可以是"引用 non-const T ",其中 T 是成员函数类的名称( 好像它被含蓄地宣布了,并且

— 没有默认参数。

[dcl.fct.def.delete]

表单的函数定义:

             属性说明符-seqoptdecl-specifier-seqoptdeclarator = delete ;

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

我的问题是,为什么会这样?如果标准可以允许删除任何函数,我认为允许默认任何函数都没有害处。N2210的措辞似乎暗示默认的自由函数将被允许。例如

在标准变更下,它说:

[...]

增加新的第7段。

"=default;"的函数定义,称为显式默认定义,完全具有隐式默认值的实现 定义(12.1、12.4、12.8(。[ 注意:成员函数 类定义之外的显式默认定义必须 也在类定义中声明。— 尾注 ] 与 隐式默认定义,显式默认定义 可能是非内联的。[...]

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

因为只有特殊成员函数才具有明确定义的"默认"定义,如果不声明函数或任何其他会禁止它的函数,则会隐式生成这些定义。

如果我写

int f() = default;

您希望该函数做什么?

逻辑根本没有改变,只是措辞。 看原著

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

只有特殊成员函数具有"隐式默认定义"。 尝试显式默认任何其他函数的定义不明确,因为它是根据不存在的东西(隐式默认定义(定义的。