C++ “a”是什么;“预期毁灭者”;在C++;20?
似乎在C++20中引入了一种称为“预期析构函数”的东西。 在:C++ “a”是什么;“预期毁灭者”;在C++;20?,c++,language-lawyer,destructor,c++20,raii,C++,Language Lawyer,Destructor,C++20,Raii,似乎在C++20中引入了一种称为“预期析构函数”的东西。 在: 在析构函数声明中,声明器是以下形式的函数声明器(11.3.5) ptr声明符(参数声明子句)noexcept说明符(opt)属性说明符seq(opt) 在C++20中,这被更改为: 其声明器id具有以~开头的非限定id的声明器声明了预期析构函数;其声明器应为以下形式的函数声明器([dcl.fct]) ptr声明符(参数声明子句)noexcept说明符(opt)属性说明符seq(opt) 那么这个“潜在的毁灭者”是什么呢?至少对我来说
我认为这可能是为了在模板元编程中使用,或者可能与SFINAE有关,但这些只是猜测。它的意思就是它所说的意思。它是一个“析构函数”,由英语单词“prospective”修饰,意思是“潜在的、可能的或预期的”。所以它是一个潜在的析构函数 该概念的目的是允许。。。概念 析构函数是具有特殊属性和行为的特殊成员函数。但最重要的是,您只允许拥有一个类,并且您必须在使用类时立即知道您拥有的是哪一个类(甚至与默认构造函数都不同) 但是,如果您希望基于类的模板参数是否满足某些概念而有不同的析构函数实现,则意味着您必须有多个析构函数。它们将根据
要求
条款进行区分
考虑std::可选。如果T
具有普通析构函数,则optional
的析构函数必须是普通析构函数。但是,如果启用了optional
,则非平凡表单需要显式调用非平凡析构函数。这是两个函数体:=default
和{/*actual code*/}
历史上,这是通过使用基类或成员类型来实现的,该基类或成员类型专门用于T
是否有一个普通的析构函数。但是适当的requires
子句可以使它更容易实现
根据您引用的标准的一部分,稍后将确定哪个析构函数声明仍然有效。进行重载解析需要对所有“预期析构函数”进行模板替换。这会导致其requires
子句的任何此类析构函数无法消失。如果这个过程分解为一个析构函数,那么这就是实际的析构函数。如果它解析为多个析构函数,那么代码的格式就不正确。相关:出于类似的原因,也有潜在的复制构造函数。有更多关于这些。