这个简单的程序被EDG(ICC)接受,但被GCC和Clang拒绝。
它是否形成良好?如果没有,为什么?
int main() {
int n;
n.~int();
}
对于好奇:该程序没有做任何事情,我更怀疑这个语言功能甚至还有一个用例。有模板,但它们是否生成表达式语法是有争议的。此类主题不适用于此网站。这里没什么可看的。
编辑:这个问题的标题很奇怪。我认为问题是在int::
之前缺少~int
限定词。这个问题的灵感来自于this Q&A,它鼓励在调用类似derived_object::~base_class()
之类的东西时省略限定符。然而,这是不正确的only accepted by GCC。
答案 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错误,这是不寻常的。