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

Class declaration in same scope as using declaration compiles in GCC but not MSVS

根据 c++ 标准,下面的程序是良构的吗?

namespace X { class A; }

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

int main() {}

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

我没有发现我的程序违反了 c++ 标准中的任何规则。

如果程序是合式的,为什么visual studio会报错?

如果程序格式不正确,它违反了 c++ 标准中的什么规则,为什么 gcc 不报错?

我不是要编译我的程序。我只是想看看它是否符合 c++ 标准,以及为什么我测试的两个编译器的行为不同。

不太确定,但您可以尝试这样的操作:

namespace X { class A; }

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

int main() 
{
  return 0;
}

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

Given a set of declarations in a single declarative region, each of which specifies the same unqualified name,

— they shall all refer to the same entity, or all refer to functions and function templates; or

— exactly one declaration shall declare a class name or enumeration name that is not a typedef name and the other declarations shall all refer to the same variable or enumerator, or all refer to functions and function templates; in this case the class name or enumeration name is hidden

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

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