C++20 中的 "prospective destructor" 是什么?

What is a "prospective destructor" in C++20?

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

  1. In a declaration of a destructor, the declarator is a function declarator (11.3.5) of the form

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

在 C++20 中这被更改为 this:

  1. A declaration whose declarator-id has an unqualified-id that begins with a ~ declares a prospective destructor; its declarator shall be a function declarator ([dcl.fct]) of the form

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

那么这个“准析构函数”是什么?好吧,标准似乎并没有阐明,至少对我而言:

  1. At the end of the definition of a class, overload resolution is performed among the prospective destructors declared in that class with an empty argument list to select the destructor for the class, also known as the selected destructor. The program is ill-formed if overload resolution fails.

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

我认为这可能是为了在模板元编程中使用,或者可能对 SFINAE 有所帮助,但这些只是猜测。

言出必行。它是一个“析构函数”,由英文单词“prospective”修饰,意为“潜在的、可能的或预期的”。所以它是一个潜在的析构函数。

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

析构函数是具有特殊属性和行为的特殊成员函数。但最重要的是,你只能拥有一个,并且当你使用 class 时你必须立即知道你拥有哪一个(甚至与默认构造函数不同)。

然而,如果你想根据class的模板参数是否满足某个概念而有不同的析构函数实现,这意味着你必须有多个析构函数。它们将根据 requires 个子句进行区分。

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

从历史上看,这是通过使用基础 class 或成员类型来完成的,该类型专门针对 T 是否具有平凡的析构函数。但是适当的 requires 子句可以使其更容易实施。

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