示例代码:
struct X { void f() {} };
typedef X A;
namespace N {
struct A { void g() {} };
};
using N::A;
int main()
{
A a;
a.f();
}
这段代码正确编译,A a;
创建了一个X
,而不是N::A
。
标准中的哪些规则涵盖了这种行为?我期待一个错误,A a;
将是模棱两可的。如果我命名第一个结构A
而不是X
并删除typedef,那么我确实得到了这样的错误。 (g ++ 8.3)
根据[namespace.udecl]/1,using N::A
将不合格的A
引入使用声明出现的声明区域。
... unqualified-id在声明性区域中声明,其中using-declaration作为using-declarator引入的每个声明的同义词出现。
所以[namespace.udecl]/13共同涵盖了歧义
由于using声明是声明,因此对同一声明性区域中同名声明的限制也适用于using声明。
给定一个声明区域中的一组声明,每个声明区域指定相同的非限定名称,
- 它们都应指同一实体,或全部指功能和功能模板;要么
- 正好一个声明应声明一个不是typedef名称的类名或枚举名,其他声明都应引用相同的变量,非静态数据成员或枚举数,或者全部引用函数和函数模板;在这种情况下,隐藏类名或枚举名。
OP中的typedef
声明和使用声明不填充子弹,因此同一声明区域中的声明对是格式错误的。