为什么可以删除任何函数,而只能删除默认的特殊成员函数
Why can you delete any function, but only default special member functions?
以前:
-
是否可以删除(或默认(非特殊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;"的函数定义,称为显式默认定义,完全具有隐式默认定义的实现
只有特殊成员函数具有"隐式默认定义"。 尝试显式默认任何其他函数的定义不明确,因为它是根据不存在的东西(隐式默认定义(定义的。
- 如何通过 getter 函数删除矢量的元素?
- C++类析构函数删除成员(如果"owner"?
- 使用私有析构函数删除动态分配的对象
- C ++(为什么)确实移动构造函数删除运算符=
- 析构函数删除错误的元素
- C++ 类析构函数删除部分但不是全部成员数据
- 如何使用 deleteEntry 函数 c++ 删除数组中的单个字符串
- 仅仅以避免隐式复制构造函数删除,使用shared_ptr而不是unique_ptr作为类成员明智
- 析构函数删除在 main 中声明的动态数组
- 如果未分配申报表,是否需要删除或处理动态数组?还是它被函数删除
- C++ 函数删除一行
- g++空函数删除是否递归工作
- C++析构函数删除东西(对象,指针?)太快
- C++析构函数删除包含动态数组作为数据成员的对象时的用法
- C++11 析构函数 = 删除
- 父类析构函数删除具有外部启动元素的子类
- 函数删除太多
- C++析构函数删除共享内存
- C++,如何让此函数删除存储在数组中的字符串
- 析构函数删除数组时出错