与在GCC中使用声明编译相同范围内的类声明但不在MSVS中编译

Sup*_*mum 5 c++ declaration using-declaration language-lawyer

以下程序是否符合c ++标准?

namespace X { class A; }

namespace Y { using X::A; class A {}; }

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

我用不同的编译器得到了不同的结果:

  • gcc编译它没有错误.
  • visual c ++给出错误C2888:'X :: A':符号不能在命名空间'Y'中定义

我没有在我的程序违反的c ++标准中找到任何规则.

如果程序格式正确,为什么visual studio会出错?

如果程序格式不正确,那么c ++标准中的规则是否会违反,为什么gcc不会出错?

我不是想让我的程序编译.我只是想根据c ++标准找出它是否格式正确,以及为什么我测试的两个编译器表现不同.

Ker*_* SB 4

我认为该程序格式不正确。[basic.scope.declarative]/4 说:

\n
\n

给定单个声明区域中的一组声明,每个声明都指定相同的非限定名称,

\n

\xe2\x80\x94 它们都应该指同一个实体,或者都指函数和函数模板;或者

\n

\xe2\x80\x94 恰好有一个声明应声明一个不是 typedef 名称的类名或枚举名称,并且其他声明应全部引用相同的变量或枚举器,或者全部引用函数和函数模板;在这种情况下,类名或枚举名被隐藏

\n
\n

两次不合格名称声明A引用不同的实体,它们都是类。

\n

(有趣的是,GCC 6.0 和 Clang 3.7 似乎都没有这样诊断。两者都接受编写的代码(不诊断具有相同名称的两个不同类的声明)。如果您添加到 的主体,那么X::A a;Clangmain会抱怨不完整类型X::A。)

\n