示例代码:
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)
答案 0 :(得分:3)
根据[namespace.udecl]/1 using N::A
,将不合格的A
引入使用声明出现的声明区域。
... unqualified-id在声明区域中声明,在该声明区域中using-声明作为using-declarator引入的每个声明的同义词。
因此,[namespace.udecl]/13共同掩盖了模糊性
由于using-declaration是声明,因此对同一声明性区域中相同名称的声明的限制也适用于using-declaration。
在单个声明性区域中给出一组声明,每个 指定相同的非限定名称,
- 它们均应指代同一实体,或均指功能和功能模板;或
- 恰好一个声明应声明不是typedef名称的类名或枚举名,而其他声明应全部指代相同的变量,非静态数据成员或枚举器,或全部指代函数和函数模板;在这种情况下,类名称或枚举名称是隐藏的。
OP中的typedef
声明和using声明不会填满任何一个项目符号,因此,同一声明性区域中的一对声明格式不正确。