【问题标题】:Unqualified pseudo-destructor-name不合格的伪析构函数名称
【发布时间】:2014-10-15 18:56:00
【问题描述】:

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

格式是否正确?如果不是,为什么?

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

致好奇者:该程序不做任何事情,我相当怀疑这种语言功能是否有用例。有模板,但它们是否生成表达式语法是有争议的。此类主题不适合本网站。这里没什么可看的。


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

【问题讨论】:

  • 该死,我正要从很久以前看到的评论中摘录,但它是your comment
  • @chris 实际上这很有见地,当时我注意到“为了语法”需要typedef int INT。事实上,int 不是 type-name
  • 这个用例是std::allocator::destroy()
  • @T.C.那是一个模板,两阶段模板引擎在实例化时不会生成语法产生式。但是,这是我在后记中提到避免的话题​​。

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


【解决方案1】:

我认为这是不正确的,因为~int 不是有效的伪析构函数名称。根据 §5.2/1 的语法,在 pseudo-destructor-name 中,波浪号后面必须跟 type-namedecltype-specifier时间>。 type-nameclass-nameenum-nametypedef-name simple-template-id (§7.1.6.2/1),而int 不是这些,所以int 不是type-name(虽然它是一个类型说明符)。

(引用自 N3936, C++14 草案。)

【讨论】:

  • 你赢得了比赛!正如发布的答案一样,至少:)。
【解决方案2】:

伪析构函数名称是(§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(); 的格式不正确。

【讨论】:

  • 5.2.4/2 不是说类型应该是标量类型,int 是什么?
  • @0x499602D2 int 不是 type-name,所以 ~int 甚至没有通过语法检查,并且对类型的语义约束不甚至没有发挥作用。
【解决方案3】:

pseudo-destructor-name 语法产生式都需要 type-name 标识符,而不是 simple-type-specifiers 这就是 @987654321 @是。

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

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 2016-03-04
    • 1970-01-01
    • 2018-04-30
    • 2014-07-22
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多