尝试通过using-declaration定义命名空间成员

时间:2015-07-18 22:55:48

标签: c++ namespaces language-lawyer definition using-declaration

考虑以下计划。根据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() {}

1 个答案:

答案 0 :(得分:11)

目前的工作草案N4527,[8.3p1]:

  

[...]当 declarator-id 合格时,声明应引用a   以前声明的类或名称空间的成员   限定符指的是(或者,在命名空间的情况下,指的是元素的元素)   该命名空间的内联命名空间集(7.3.1))或特化   物;该成员不仅仅是由一个人介绍的    using-declaration 在由类提名的类或命名空间的范围内    declarator-id 嵌套名称说明符。 [...]

所以,绝对是不合理的;海湾合作委员会和MSVC是错误的。