C++ “a”是什么;“预期毁灭者”;在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) 那么这个“潜在的毁灭者”是什么呢?至少对我来说

似乎在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
    子句的任何此类析构函数无法消失。如果这个过程分解为一个析构函数,那么这就是实际的析构函数。如果它解析为多个析构函数,那么代码的格式就不正确。

    相关:出于类似的原因,也有潜在的复制构造函数。有更多关于这些。