例子:
struct A {};
struct B { using A = A; };
int main()
{
B b;
}
Clang 编译这个。GCC 抛出错误(示例):
'using A = struct A' 的声明改变了 'A' 的含义
标准说:
如果一个类名 ([class.name]) 或枚举名 ([dcl.enum]) 和一个变量、数据成员、函数或枚举器在同一个声明区域(以任何顺序)以相同的名称(不包括通过 using 指令 ([basic.lookup.unqual])) 使声明可见,类或枚举名称在变量、数据成员、函数或枚举器名称可见的地方隐藏。
PS感谢来自莫斯科的弗拉德
在 S 类中使用的名称 N 应在其上下文中引用相同的声明,并且在 S 的完整范围内重新评估时。违反此规则不需要诊断
事实证明,GCC 的行为不正确?
语法
using A = A;是typedef. 它允许您在另一个命名空间中使用类型同义词。这是模拟的:这些规则不允许您覆盖已在给定类或结构空间中创建的类型。
标准 :
编译器会向您提示错误:
也就是说,在结构 B 内部,类型 A 不能称为类型 A(结构 B)。
提示:要调整不同的编译器行为,using可用于指示您要从哪个命名空间获取同义词:
我认为 GCC 中有一个错误。由于
B :: A尚未创建新的类型同义词,它typedef已经说它存在。标准 :