考虑以下计划。根据c ++标准(参考所需标准的相关部分),它是否格式良好:
namespace X { extern int i; }
namespace N { using X::i; }
int N::i = 1;
int main() {}
我为不同的编译器得到了不同的结果。我正在试图弄清楚我应该为哪个编译器提交错误报告:
Clang:给出以下编译错误:名称空间'N'中没有名为'i'的成员
GCC和Visual C ++编译时没有错误。
为了进行比较,下面给出了所有三个编译器的编译错误:
namespace X { void f(); }
namespace N { using X::f; }
void N::f() {};
int main() {}
答案 0 :(得分:11)
目前的工作草案N4527,[8.3p1]:
[...]当 declarator-id 合格时,声明应引用a 以前声明的类或名称空间的成员 限定符指的是(或者,在命名空间的情况下,指的是元素的元素) 该命名空间的内联命名空间集(7.3.1))或特化 物;该成员不仅仅是由一个人介绍的 using-declaration 在由类提名的类或命名空间的范围内 declarator-id 的嵌套名称说明符。 [...]
所以,绝对是不合理的;海湾合作委员会和MSVC是错误的。