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

Trying to define namespace member via using-declaration

本文关键字:定义 命名空间 成员 using-declaration      更新时间:2023-10-16

考虑下面的程序。它是否符合c++标准(需要参考标准的相关部分):

namespace X { extern int i; }
namespace N { using X::i; }
int N::i = 1;
int main() {}

我得到不同的编译器不同的结果。我想弄清楚我应该为什么编译器提交一个bug报告:

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

  • GCC和Visual c++编译它没有错误。

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

namespace X { void f(); }
namespace N { using X::f; }
void N::f() {};
int main() {}

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

[…当declarator-id被限定时,声明应引用a类或命名空间的先前声明的成员限定符引用(或者在名称空间的情况下,引用)的元素该命名空间的内联命名空间集(7.3.1))或专门化;该委员不应仅仅是由一名律师介绍的在类或命名空间的作用域中使用using-declaration声明符id嵌套名称说明符。[…]

所以,绝对是病态的;GCC和MSVC是错误的