c++ - 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)
解决方案
根据[namespace.udecl]/1 using N::A
将 unqualifiedA
引入到 using 声明出现的声明区域中。
... unqualified-id 在声明区域中声明,其中 using 声明作为 using 声明器引入的每个声明的同义词出现。
因此, [namespace.udecl]/13共同涵盖了歧义
由于 using-declaration 是一个声明,因此在同一声明区域中对同名声明的限制也适用于 using-declaration。
给定单个声明区域中的一组声明,每个声明都指定相同的非限定名称,
- 都指同一个实体,或者都指函数和函数模板;或者
- 确切地说,一个声明应声明一个不是 typedef 名称的类名或枚举名,而其他声明应全部引用相同的变量、非静态数据成员或枚举数,或全部引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的。
OP 中的typedef
声明和 using 声明不填充任何一个项目符号,因此同一声明区域中的一对声明格式不正确。
推荐阅读
- azure-active-directory - 企业应用程序中基于组角色的授权
- c++ - Adafruit NeoPixel 库在处理超过 7 个 LED 灯条时不起作用
- angularjs - angularjs中的提示框只允许字母数字字符
- python - 使用字典截取列表中的部分字符串
- android - com.andorid.volley.AuthFailureError 在使用 volley 库
- ios - 在 Swift 中保存数组
- multithreading - 单核没有多线程优势
- go - 避免在 Go 中编写过多的 getter 和 setter
- python - 计算判别的数学域误差
- python - 如何在 Python3 中使用 App Engine 安排 Cloud Datastore 导出