似乎在C ++ 20中引入了一种称为“预期析构函数”的东西。在C ++ 17 [class.dtor]中:
- 在析构函数的声明中,声明符是以下形式的函数声明符(11.3.5)
ptr-declarator(parameter-declaration-clause)noexcept-specifier(opt)属性-specifier-seq(opt)
在C ++ 20这得到了改变,以这样:
- 声明者的标识符具有以〜开头的非限定标识符的声明,声明了预期的析构函数;其声明符应为以下形式的函数声明符([dcl.fct]):
ptr-declarator(parameter-declaration-clause)noexcept-specifier(opt)属性-specifier-seq(opt)
那么,这个“潜在的破坏者”是什么?好吧,这个标准似乎并不清楚,至少对我来说:
- 在类定义的末尾,将在该类中声明的预期析构函数与空参数列表之间执行重载解析,以选择该类的析构函数,也称为选定析构函数。如果重载解析失败,则程序格式错误。
引入“预期析构函数”这一新概念的原因是什么?这到底是什么意思?它如何更改代码?它允许做什么?
我认为这可能是打算用于模板元编程中,或者可能与SFINAE有关,但这些只是猜测。
它代表了它的意思。它是一个“析构函数”,用英语单词“ prospective”修饰,表示“潜在,可能或预期的”。因此,它是一个潜在的破坏者。
概念的目的是允许...概念。
析构函数是具有特殊属性和行为的特殊成员函数。但最重要的是,只允许您拥有一个,并且在使用类时(即使是默认构造函数也一样),您必须立即知道自己拥有哪个。
但是,如果要根据类的模板参数是否满足某个概念来使用不同的析构函数实现,则意味着您必须具有多个析构函数。它们将根据requires
条款进行区分。
考虑一下std::optional<T>
。optional<T>
如果T
有一个琐碎的析构函数,则必须使用琐碎的析构函数。但是,如果使用,非平凡形式需要显式调用非平凡析构函数optional
。这就是两个函数体:= default
和{ /*actual code*/ }
。
从历史上看,这是通过使用专门针对是否T
具有琐碎析构函数的基类或成员类型完成的。但是适当的requires
条款可以使其更容易实现。
后面将根据您引用的标准部分确定哪个析构函数声明可以保留。进行重载解析需要对所有“预期析构函数”进行模板替换。这将导致其requires
子句无法消失的任何此类析构函数。如果此过程分解为单个析构函数,那么这就是实际的析构函数。如果解析为多个析构函数,则代码格式错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句