【问题标题】:Trying to define namespace member via using-declaration尝试通过 using-declaration 定义命名空间成员
【发布时间】:2024-01-23 10:28:02
【问题描述】:

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

【问题讨论】:

  • 有趣的是,VS2013 可以编译,但 IntelliSence 显示 "Error: namespace "N" has no actual member "i"
  • 我想答案就在这里:link
  • @Supremum 您可以在isocpp.org/std/the-standard获取您自己的 C++ 标准副本以阅读。
  • Jorj Tyron:那个链接没有回答这个问题。这个问题与最佳实践无关。
  • @Supremum 我通过将“使用 X::i”更改为“使用命名空间 X;”来使用 CLang。

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


【解决方案1】:

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

[...] 当 declarator-id 是合格的,该声明应引用一个 先前声明的类或命名空间的成员 限定符指(或者,在命名空间的情况下,指 该命名空间的内联命名空间集(7.3.1))或专业化 其中;该成员不应仅由某位成员介绍 using-declaration 在由指定的类或命名空间范围内 declarator-idnested-name-specifier。 [...]

所以,肯定是不正确的; GCC 和 MSVC 是错误的。

【讨论】: