首页 > 解决方案 > typedef 中的同名并从命名空间中使用

问题描述

示例代码:

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++namespaceslanguage-lawyertypedefambiguous

解决方案


根据[namespace.udecl]/1 using N::A将 unqualifiedA引入到 using 声明出现的声明区域中。

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

因此, [namespace.udecl]/13共同涵盖了歧义

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

[basic.scope.declarative]/4

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

  • 都指同一个实体,或者都指函数和函数模板;或者
  • 确切地说,一个声明应声明一个不是 typedef 名称的类名或枚举名,而其他声明应全部引用相同的变量、非静态数据成员或枚举数,或全部引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的。

OP 中的typedef声明和 using 声明不填充任何一个项目符号,因此同一声明区域中的一对声明格式不正确。


推荐阅读