繁体   English   中英

typedef中的相同名称以及命名空间中的使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM