c++ - C++类成员名查找规则中注1是什么意思?
问题描述
来自http://eel.is/c++draft/class.member.lookup#1:
在范围内搜索来自程序点P
X
的名称是对from的单个搜索,除非是类或类模板的范围,在这种情况下,以下步骤定义搜索结果。N
X
N
P
X
T
[注1:只有当
N
是转换函数ID或单次搜索什么也没找到时,结果才会有所不同。——尾注]
我很难理解 Note。似乎来自类范围的“单一搜索”会在命名空间范围内找到前面的声明,因为命名空间范围包含类范围。但是,正如我们所知,如果名称也被声明为非依赖基类的成员,则基类成员优先于命名空间成员。注 1似乎与此相矛盾,因为它基本上是在说“如果N
不是转换函数 ID,那么您可以只进行正常的单次搜索,并且只有当您找不到任何内容时,才使用本节中的过程”。但是单次搜索会通过找到命名空间范围声明而成功,并且类成员查找会产生不同的结果。
我的理解错误在哪里?
解决方案
回答
一次搜索只考虑一个范围——而不是封闭的命名空间,甚至是基类。这是一个考虑所有封闭范围的非限定搜索。单次搜索和(普通)搜索是这些高级过程的子程序。
语境
应该说,由于最近有很多这样的问题,这些术语的存在是为了减少“程序员级别”结构(如(非)限定名称查找)定义中的歧义和不精确性(例如,CWG 第 191 期)。我发明它们并不是为了增加典型程序员应该记住的词汇量。(换句话说,标准不是教程。)
当然,在这方面,这个特定的问题并没有什么特别之处,但我必须希望这会因此倾向于找到需要看到它的人。
推荐阅读
- r - 如何使用 R 包标度将值分为正数和负数
- python - 将异常记录到python中的日志文件中
- discord.js - 我如何过滤所有用户徽章 | DiscordJS V12
- javascript - html 和 css 火箭动画
- python - 下标问题(脚本实例化并从另一个脚本调用)仅运行被调用函数,而不是整个脚本
- c# - Selenium 无法继续,因为 chrome 不加载 UI
- go - 这段代码是如何工作的,这个语法记录在哪里?
- android - 有没有办法确定 WebView 何时加载了 HTML?(所以当 DOM 准备好时)
- multithreading - 使用 CAS 习语时,ABA 是否与推送/插入操作相关?
- git - 将新项目代码推送到 github 上的新存储库,但它推送了所有新项目