3

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

是否形成良好?如果不是,为什么?

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

对于好奇的人:该程序不做任何事情,我很怀疑这种语言功能甚至没有用例。有模板,但它们是否生成表达式语法是有争议的。此类主题不适合本网站。这没东西看。


编辑:这个问题的标题很奇怪。我认为问题是之前缺少int::限定符~int。这个问题的灵感来自这个问答,它鼓励在调用类似的东西时省略限定符derived_object::~base_class()。然而,这是格式错误的,仅被 GCC 接受

4

3 回答 3

4

我认为这是不正确的,因为~int它不是有效的伪析构函数名称。根据第 5.2/1 节的语法,在伪析构函数名称中,波浪号必须后跟类型名称decltype-specifiertype-nameclass-nameenum-nametypedef-namesimple-template-id (§7.1.6.2/1),它们int都不是,所以int不是type-name(尽管它是类型说明符)。

(参考来自 N3936,C++14 草案。)

于 2014-08-22T01:21:13.650 回答
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

类型名称是( §7.1.6.2 [dcl.type.simple]/p1):

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

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

于 2014-08-22T01:21:55.643 回答
2

伪析构函数名称语法产生式都需要类型名称标识符,而不是简单类型说明int

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

于 2014-08-22T01:22:05.043 回答