【发布时间】:2021-08-19 02:34:55
【问题描述】:
来自http://eel.is/c++draft/class.member.lookup#1:
在
X范围内搜索程序点中的名称NP 是在X中从@ 中搜索N987654326@ 除非X是类或类模板T的范围,在这种情况下,以下步骤定义搜索结果。[注 1:只有当
N是 conversion-function-id 或者单次搜索什么也找不到时,结果才会有所不同。 — 尾注]
我很难理解 Note。似乎来自类范围的“单一搜索”会在命名空间范围内找到前面的声明,因为命名空间范围包含类范围。但是,正如我们所知,如果名称也被声明为非依赖基类的成员,则基类成员优先于命名空间成员。 注 1 似乎与此相矛盾,因为它基本上是在说“如果 N 不是转换函数 ID,那么您可以进行正常的单次搜索,并且只有在您找不到任何东西时,然后使用本节中的过程”。但是单次搜索会通过找到命名空间范围声明而成功,并且类成员查找会产生不同的结果。
我的理解错误在哪里?
【问题讨论】:
-
不确定我是否遗漏了一些上下文,但我什至无法理解非注释部分。我认为“搜索”是定义上的单一搜索?这不是它说“A search”而不是“Multiple search”的原因吗?那么“除非……”不矛盾吗?
-
好的,这是WG21用英语玩的游戏。 “单次搜索”有自己的定义,“单次搜索”并不像人们可能怀疑的那样表示搜索的数量!
-
@JohannesSchaub-litb:也许你会更喜欢“简单搜索”?如果我们认为编辑问题令人困惑,我们总是可以提交。
-
@Davis 是的,IMO 会好得多!
-
@DavisHerring 我认为“单一搜索”并不那么令人困惑,但我对“绑定”一词感到困惑([basic.scope.scope]/2.5)。人们通常认为“N is bound to D”是两个实体之间的关系,然后这个定义定义了这种关系的where -即,in 目标范围(包括任何子范围)。但是您似乎打算将“绑定”作为三个实体之间的关系,其中“在”一词是该术语的一部分,并且没有通常的含义。这可能会变得不那么令人困惑,但我不确定如何。
标签: c++ language-lawyer c++23