C++11 gcc:声明中的显式限定?标准参考号
C++11 gcc: explicit qualification in declaration? Standard ref?
使用gcc 4.7编译以下C++11程序时:
extern int i;
int ::i;
int main()
{
}
gcc抱怨:
error: explicit qualification in declaration of `i`
这是不合规行为吗?该程序在标准中的哪些地方被视为格式错误?
8.3p1似乎表明应该允许:
如果限定符是global::scope解析运算符,声明符id引用在global中声明的名称命名空间范围。
更新:
自N3485 8.3p1:
声明符列表出现在可选的(第7条)decl说明符seq(7.1)之后恰好一个声明者id;它命名所声明的标识符。出现在声明符中的不合格id-id应该是一个简单的标识符,除了一些特殊函数(12.3、12.4、13.5)的声明和模板专业化或部分专业化的声明(14.7)。当声明符id是限定的时,声明应引用限定符所指向的类或命名空间的先前声明的成员引用(或者,在命名空间的情况下,引用该命名空间的内联命名空间集的元素(7.3.1))或其专业化;该成员不应仅通过使用声明介绍在由声明符id的嵌套名称说明符指定的类或命名空间的作用域中。这个限定声明符id的嵌套名称说明符不应以decltype说明符开头。[注意:如果限定符是global::scope解析运算符,声明符id引用在global中声明的名称命名空间范围。--end note]声明符id后面的可选特性说明符seq适用于声明的实体。
下一句话说(在n3337中):
声明者id不应被限定为,除非定义其外部的成员函数或静态数据成员类,定义或显式实例化一个函数或命名空间外的变量成员命名空间,或在其命名空间之外定义显式专门化,或声明friend函数,它是另一个类或命名空间的成员。
全局变量的定义在例外情况中没有提及。
GCC根据C++11是正确的。在C++14中,这是允许的。看见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#482
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++错误消息*成员参考.**初学者*
- 编译标准库类型
- 标准::enable_if和通用参考的使用差异
- 标准::积累参考?
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- 标准库中的任何正则表达式语法是否支持 (?(定义)用于子模式参考?
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 是参考转换是标准转换
- 我怎样才能打破这个标准::shared_ptr参考循环
- C++11:模板专用化的 constexpr 成员的标准参考需要额外声明
- 为什么我不能C++通用参考与标准参考混合使用?
- C++11 gcc:声明中的显式限定?标准参考号
- 通用参考的标准/官方名称是什么?
- 在标准中使用 8.5.3p4,如何确定 T 与 T&的参考兼容?
- c++标准布局和参考
- C++14/1y: "operator+ must take either one or two arguments"的标准参考 ?
- 我们可以将规范性参考文献中未明确引用的内容应用到C++标准中吗