使用 decltype 显式析构函数调用

Explicit destructor call with decltype

本文关键字:析构 函数调用 decltype 使用      更新时间:2023-10-16

请考虑以下代码片段:

struct Foo {};
int main()
{
   Foo f;
   f.~decltype(f)(); // fine with clang, error with gcc
   f.~decltype(auto)(); // error with both clang and gcc 
}

显式析构函数调用的规则由标准语法处理,其定义如下pseudo-destructor-name

伪析构函数名称:
嵌套名称说明符 opt 类型名称 :: ~ 类型名称
嵌套名称说明符模板简单模板 ID :: ~类型名称
~ 类型名称
~ 描述型说明符

和:

描述类型说明符:
decltype ( 表达式 )
分类 ( 自动 )

那么上面的代码片段不应该按照标准格式正确吗?(不考虑析构函数在同一对象上被调用两次,然后第三次调用的事实。

海湾合作委员会直播
叮当直播

您的程序格式不正确。
§7.1.6.4/[dcl.spec.auto] 声明:

本节中未明确允许的上下文中使用autodecltype(auto)的程序格式不正确。

在那里,我找不到任何可以让你写这篇文章的东西。通常,decltype(auto)仅用于变量和函数声明。但是,语法允许的事实并不意味着它的格式正确。

因此,编写类似f.~decltype(f)()的东西并没有被明确禁止,并且按照语法中所述是允许的。GCC 不会编译它的事实很可能是一个错误。