请考虑以下代码段:
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)
那么根据标准,上述代码片段是否应该是格式良好的呢? (不考虑析构函数被调用两次然后第三次在同一个对象上。)
答案 0 :(得分:10)
您的计划格式不正确 §7.1.6.4/ [dcl.spec.auto] 陈述:
在本节未明确允许的上下文中使用
auto
或decltype(auto)
的程序格式不正确。
在那里,我找不到任何可以让你写这个的东西。通常,decltype(auto)
仅用于变量和函数声明。然而,语法允许的事实并不意味着它的结构良好。
因此,写f.~decltype(f)()
之类的东西并没有被明确禁止,并且如语法中所述是允许的。 GCC不会编译它的事实很可能是一个错误。