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

Sup*_*mum 16 c++ namespaces definition using-declaration language-lawyer

考虑以下程序.根据c ++标准(参考所需标准的相关部分)是否格式良好:

namespace X { extern int i; }

namespace N { using X::i; }

int N::i = 1;

int main() {}
Run Code Online (Sandbox Code Playgroud)

我为不同的编译器得到了不同的结果.我正在试图弄清楚我应该为哪个编译器提交错误报告:

  • Clang:给出以下编译器错误:名称空间'N'中没有名为'i'的成员

  • GCC和Visual C++编译它没有错误.

为了比较,下面给出了所有三个编译器的编译器错误:

namespace X { void f(); }

namespace N { using X::f; }

void N::f() {};

int main() {}
Run Code Online (Sandbox Code Playgroud)

bog*_*dan 11

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

[...]当declarator-id被限定时,声明应引用先前声明的限定符所引用的类或命名空间的成员(或者,如果是命名空间,则引用内联命名空间集的元素)该命名空间(7.3.1))或其专业化; 该成员不得只是已经被引入了 using声明由指定的类或命名空间的范围嵌套名称说明符的的声明符-ID.[...]

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