什么是C ++ 20中的“预期析构函数”?

fans_3d_graphics_pr ...

似乎在C ++ 20中引入了一种称为“预期析构函数”的东西。C ++ 17 [class.dtor]中

  1. 在析构函数的声明中,声明符是以下形式的函数声明符(11.3.5)

ptr-declarator(parameter-declaration-clause)noexcept-specifier(opt)属性-specifier-seq(opt)

在C ++ 20这得到了改变,以这样

  1. 声明者的标识符具有以〜开头的非限定标识符的声明,声明了预期的析构函数;其声明符应为以下形式的函数声明符([dcl.fct]):

ptr-declarator(parameter-declaration-clause)noexcept-specifier(opt)属性-specifier-seq(opt)

那么,这个“潜在的破坏者”是什么?好吧,这个标准似乎并不清楚,至少对我来说:

  1. 在类定义的末尾,将在该类中声明的预期析构函数与空参数列表之间执行重载解析,以选择该类的析构函数,也称为选定析构函数。如果重载解析失败,则程序格式错误。

引入“预期析构函数”这一新概念的原因是什么?这到底是什么意思?它如何更改代码?它允许做什么?

我认为这可能是打算用于模板元编程中,或者可能与SFINAE有关,但这些只是猜测。

尼科尔·波拉斯(Nicol Bolas)

它代表了它的意思。它是一个“析构函数”,用英语单词“ prospective”修饰,表示“潜在,可能或预期的”。因此,它是一个潜在的破坏者。

概念的目的是允许...概念。

析构函数是具有特殊属性和行为的特殊成员函数。但最重要的是,只允许您拥有一个,并且在使用类时(即使是默认构造函数也一样),您必须立即知道自己拥有哪个。

但是,如果要根据类的模板参数是否满足某个概念来使用不同的析构函数实现,则意味着您必须具有多个析构函数。它们将根据requires条款进行区分

考虑一下std::optional<T>optional<T>如果T有一个琐碎的析构函数,则必须使用琐碎的析构函数。但是,如果使用,非平凡形式需要显式调用非平凡析构函数optional这就是两个函数体:= default{ /*actual code*/ }

从历史上看,这是通过使用专门针对是否T具有琐碎析构函数的基类或成员类型完成的但是适当的requires条款可以使其更容易实现。

后面将根据您引用的标准部分确定哪个析构函数声明可以保留。进行重载解析需要对所有“预期析构函数”进行模板替换。这将导致其requires子句无法消失的任何此类析构函数如果此过程分解为单个析构函数,那么这就是实际的析构函数。如果解析为多个析构函数,则代码格式错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是std :: ios :: exceptions在析构函数中的预期行为?

来自分类Dev

在OpenCV中,什么是VideoCapture析构函数

来自分类Dev

C ++中的析构函数直接调用

来自分类Dev

C ++析构函数中的堆栈溢出

来自分类Dev

析构函数在C ++中调用向量

来自分类Dev

C ++中的循环链表的析构函数?

来自分类Dev

C ++在析构函数中杀死线程

来自分类Dev

C ++中的“隐式析构函数”

来自分类Dev

C ++中的析构函数直接调用

来自分类Dev

为什么在Friend函数中调用析构函数

来自分类Dev

C ++。在析构函数中调用虚拟成员函数

来自分类Dev

C ++中的析构函数和构造函数排序

来自分类Dev

为什么在Delphi中命名析构函数?

来自分类Dev

从C ++中的析构函数中恢复对象?

来自分类Dev

您是否在C ++中的析构函数中调用delete?

来自分类Dev

在C ++中的析构函数中关闭连接

来自分类Dev

C ++析构函数约定

来自分类Dev

[c ++]缺少析构函数

来自分类Dev

是否可以在C ++中自动生成析构函数?

来自分类Dev

C ++ 11在派生类中删除的析构函数

来自分类Dev

在析构函数C ++中访问所有者

来自分类Dev

装饰器模式中的c ++虚拟析构函数

来自分类Dev

C ++清除类析构函数中的std :: list结构

来自分类Dev

C ++-如何在析构函数中删除子类

来自分类Dev

C ++中类析构函数的奇怪行为

来自分类Dev

C ++中的原始类型是否具有析构函数?

来自分类Dev

在C ++中调用虚拟析构函数的顺序

来自分类Dev

C ++中的析构函数不起作用

来自分类Dev

基于C ++堆栈的构造函数/析构函数无法按预期工作