[英]Same name in typedef and using from a namespace
示例代码:
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 a;
会很暧昧。 如果我命名第一个结构A
而不是X
并删除typedef,那么我确实会遇到这样的错误。 (g ++ 8.3)
根据[namespace.udecl] / 1 using N::A
将非限定A
引入到声明区域中,其中出现using声明。
... unqualified-id在声明性区域中声明,其中using-declaration作为using-declarator引入的每个声明的同义词出现。
因此,模糊性由[namespace.udecl] / 13共同涵盖
由于using声明是声明,因此对同一声明性区域中同名声明的限制也适用于using声明。
和[basic.scope.declarative] / 4
给定一个声明区域中的一组声明,每个声明区域指定相同的非限定名称,
- 它们都应指同一实体,或全部指功能和功能模板; 要么
- 正好一个声明应声明一个不是typedef名称的类名或枚举名,其他声明都应引用相同的变量,非静态数据成员或枚举数,或者全部引用函数和函数模板; 在这种情况下,隐藏类名或枚举名。
OP中的typedef
声明和using声明不填充子弹,因此同一声明区域中的声明对是格式错误的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.