不合格的伪析构函数名称

时间:2014-08-22 01:12:27

标签: c++ destructor language-lawyer pseudo-destructor

这个简单的程序被EDG(ICC)接受,但被GCC和Clang拒绝。

它是否形成良好?如果没有,为什么?

int main() {
    int n;
    n.~int();
}

对于好奇:该程序没有做任何事情,我更怀疑这个语言功能甚至还有一个用例。有模板,但它们是否生成表达式语法是有争议的。此类主题不适用于此网站。这里没什么可看的。


编辑:这个问题的标题很奇怪。我认为问题是在int::之前缺少~int限定词。这个问题的灵感来自于this Q&A,它鼓励在调用类似derived_object::~base_class()之类的东西时省略限定符。然而,这是不正确的only accepted by GCC

3 个答案:

答案 0 :(得分:4)

我认为这是不正确的,因为~int不是有效的伪析构函数名称。根据§5.2/ 1中的语法,在伪析构函数名称中,代字号必须后跟类型名称 decltype-specifier 类型名称类名枚举名称 typedef-name simple-template-id (§7.1.6.2/ 1),int不是这些,因此int不是类型名称(尽管它是类型说明符)。

(参考文献摘自N3936, C ++ 14草案。)

答案 1 :(得分:3)

伪析构函数名称是(§5.2[expr.post] / p1):

pseudo-destructor-name:
    nested-name-specifier_opt type-name :: ~ type-name
    nested-name-specifier template simple-template-id :: ~ type-name
    nested-name-specifier_opt~ type-name
    ~ decltype-specifier

type-name 是(§7.1.6.2[dcl.type.simple] / p1):

type-name:
    class-name
    enum-name
    typedef-name
    simple-template-id

因此,int不是类型名称,因此n.~int();格式不正确。

答案 2 :(得分:2)

伪析构函数名称语法产生都需要 type-name 标识符,而不是 simple-type-specifiers 这是{{ 1}}是。

所以,这是一个EDG错误,这是不寻常的。