16

考虑以下程序。它是否符合 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() {}
4

1 回答 1

11

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

[...]当declarator-id被限定时,声明应引用限定符所指的类或命名空间的先前声明的成员(或者,在命名空间的情况下,内联命名空间集合的元素该名称空间(7.3.1))或其专业化;该成员不应仅由 声明符id的嵌套名称说明符指定的类或命名空间范围内的using 声明引入。[...]

所以,绝对不正确;GCC 和 MSVC 是错误的。

于 2015-07-19T00:14:14.250 回答