当使用 gcc 4.7 编译以下 C++11 程序时:
extern int i;
int ::i;
int main()
{
}
gcc 抱怨说:
error: explicit qualification in declaration of `i`
这是不合格的行为吗?该程序在标准中的哪些地方被认为格式不正确?
8.3p1 似乎表明应该允许:
如果限定符是全局 :: 范围解析运算符,则 declarator-id 指的是在全局命名空间范围内声明的名称。
更新:
从 N3485 8.3p1:
声明符列表出现在可选(第 7 条)decl-specifier-seq (7.1) 之后。每个声明符只包含一个声明符id;它命名声明的标识符。除某些特殊函数的声明(12.3、12.4、13.5)和模板特化或部分特化的声明(14.7)外,在 declarator-id 中出现的 unqualified-id 应该是一个简单的标识符。当 declarator-id 被限定时,声明应引用限定符所指的类或命名空间的先前声明的成员(或者,在命名空间的情况下,该命名空间的内联命名空间集合的元素(7.3 .1)) 或其专业化;该成员不应仅由声明符 id 的嵌套名称说明符指定的类或命名空间范围内的 using 声明引入。限定的 declarator-id 的 nested-name-specifier 不应以 decltype-specifier 开头。[ 注意:如果限定符是全局 :: 范围解析运算符,则 declarator-id 指的是在全局命名空间范围内声明的名称。— 尾注] 声明符 id 后面的可选属性说明符序列属于声明的实体。