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() {}
我使用不同的编译器得到不同的结果:
- gcc 编译没有错误。
- visual c++ 给出错误 C2888:'X::A':无法在命名空间 'Y'
中定义符号
我没有发现我的程序违反了 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
的类型不完整。)
根据 c++ 标准,下面的程序是良构的吗?
namespace X { class A; }
namespace Y { using X::A; class A {}; }
int main() {}
我使用不同的编译器得到不同的结果:
- gcc 编译没有错误。
- visual c++ 给出错误 C2888:'X::A':无法在命名空间 'Y' 中定义符号
我没有发现我的程序违反了 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
的类型不完整。)