【发布时间】:2018-04-05 06:28:32
【问题描述】:
考虑以下 sn-p:
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 类型名称 :: ~ 类型名称
嵌套名称说明符模板 simple-template-id :: ~type-name
~ 类型名称
~ decltype-specifier
还有:
decltype-specifier:
decltype ( 表达式 )
decltype ( 自动 )
那么上面的 sn-p 不应该按照标准格式正确吗? (不考虑析构函数在同一个对象上被调用两次然后第三次的事实。)
【问题讨论】:
-
如果格式正确应该怎么办?
-
@underscore_d 应该调用析构函数吗?该示例不是实际程序。
-
没关系,但在您的情况下,要使用的语法不是“伪析构函数名称”,而是非限定 ID(形式为“~ decltype-specifier”)和“后缀表达式 ( ... )",其中后缀表达式为 "f.
"。生产伪析构函数名称仅在类型不是类类型或依赖类型时使用。
标签: c++ c++14 language-lawyer c++17