C++11声明`::T i`的含义是什么?

10
以下的C++11翻译单元是否符合规范?
typedef int T;
::T i;

如果是这样,它似乎不符合标准语法。 simple-type-specifier 应该与 ::T 匹配,但语法却是:
simple-type-specifier:
    nested-name-specifier_opt type-name

一个嵌套名称限定符(nested-name-specifier)不能匹配单独的::,因此简单类型说明符simple-type-specifier)不能匹配::T

这是一个标准缺陷吗?


2
抱歉,如果我错了,::identifier 不是指全局命名空间中的(限定的)identifier 吗? - user529758
1
"nested-name-specifier 无法匹配 ::" - 既然您对此很确定,那么您应该在问题中包含为什么无法匹配的解释。 - Timothy Shields
@H2CO3 您是正确的,先生! - nikolas
2个回答

13

这是一个规范缺陷。 最新草案N3691(PDF)中已经修复,其中nested-name-specifier是:

nested-name-specifier:
    ::
    type-name ::
    namespace-name ::
    decltype-specifier ::
    nested-name-specifier identifier ::
    nested-name-specifier templateopt simple-template-id ::

(在C++11中,第一个产生式 nested-name-specifier -> :: 缺失。)


谢谢,詹姆斯。我们正在使用N3485,这就解释了一切。谢谢。 - Andrew Tomazos
我们在这里还应该注意到,qualified-id 也受到了修复的影响,因为它不再需要针对单个 :: 前缀的特殊情况,所以这些情况被移除了。 - Andrew Tomazos

1
所以,除了答案之外,仅作澄清:::identifier是指全局命名空间中的(限定)标识符。因此,是的,问题中的代码实际上是格式良好的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接