用decltype显式析构函数调用

时间:2017-10-24 12:38:25

标签: c++ c++14 language-lawyer c++17

请考虑以下代码段:

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的标准语法处理,其定义如下:

  

伪析构函数名:
      nested-name-specifier opt type-name :: ~type-name
      nested-name-specifier模板simple-template-id :: ~type-name
      〜类型名称
      ~decltype-specifier

  

decltype-specifier:
  decltype(表达)
  decltype(auto)

那么根据标准,上述代码片段是否应该是格式良好的呢? (不考虑析构函数被调用两次然后第三次在同一个对象上。)

GCC Live
Clang Live

1 个答案:

答案 0 :(得分:10)

您的计划格式不正确 §7.1.6.4/ [dcl.spec.auto] 陈述:

  

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

在那里,我找不到任何可以让你写这个的东西。通常,decltype(auto)仅用于变量和函数声明。然而,语法允许的事实并不意味着它的结构良好。

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