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

问题描述 投票:3回答:1

示例代码:

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)

c++ namespaces language-lawyer typedef ambiguous
1个回答
3
投票

根据[namespace.udecl]/1using N::A将不合格的A引入使用声明出现的声明区域。

... unqualified-id在声明性区域中声明,其中using-declaration作为using-declarator引入的每个声明的同义词出现。

所以[namespace.udecl]/13共同涵盖了歧义

由于using声明是声明,因此对同一声明性区域中同名声明的限制也适用于using声明。

[basic.scope.declarative]/4

给定一个声明区域中的一组声明,每个声明区域指定相同的非限定名称,

  • 它们都应指同一实体,或全部指功能和功能模板;要么
  • 正好一个声明应声明一个不是typedef名称的类名或枚举名,其他声明都应引用相同的变量,非静态数据成员或枚举数,或者全部引用函数和函数模板;在这种情况下,隐藏类名或枚举名。

OP中的typedef声明和使用声明不填充子弹,因此同一声明区域中的声明对是格式错误的。

© www.soinside.com 2019 - 2024. All rights reserved.