8

来自http://eel.is/c++draft/class.member.lookup#1

在范围内搜索来自程序点PX的名称是对from的单个搜索,除非是类或类模板的范围,在这种情况下,以下步骤定义搜索结果。NXNPXT

[注1:只有当N转换函数ID或单次搜索什么也没找到时,结果才会有所不同。——尾注]

我很难理解 Note。似乎来自类范围的“单一搜索”会在命名空间范围内找到前面的声明,因为命名空间范围包含类范围。但是,正如我们所知,如果名称也被声明为非依赖基类的成员,则基类成员优先于命名空间成员。注 1似乎与此相矛盾,因为它基本上是在说“如果N不是转换函数 ID,那么您可以只进行正常的单次搜索,并且只有当您找不到任何内容时,才使用本节中的过程”。但是单次搜索会通过找到命名空间范围声明而成功,并且类成员查找会产生不同的结果。

我的理解错误在哪里?

4

2 回答 2

6

回答

一次搜索只考虑一个范围——而不是封闭的命名空间,甚至是基类。这是一个考虑所有封闭范围的非限定搜索。单次搜索和(普通)搜索是这些高级过程的子程序。

语境

应该说,由于最近有很多这样的问题,这些术语的存在是为了减少“程序员级别”结构(如(非)限定名称查找)定义中的歧义和不精确性(例如CWG 第 191 期)。我发明它们并不是为了增加典型程序员应该记住的词汇量。(换句话说,标准不是教程。)

当然,在这方面,这个特定的问题并没有什么特别之处,但我必须希望这会因此倾向于找到需要看到它的人。

于 2021-05-31T21:21:10.063 回答
0

“单一搜索”的目的用于说明查找应如何为成员执行。简单来说,如果在命名空间的范围内使用单次搜索来查找成员,如果还没有找到声明,由于这里单次搜索,将不会继续找到其封闭范围。

作为您在此处引用的规则,类或类模板的范围是“单一搜索”的一个例外,这意味着如果尚未找到任何内容,则应继续在其基类中执行单一搜索。

如果 P 在 C 的完整类上下文中,则声明集是在C 的范围内从 C 的类说明符之后立即搜索N 的结果,否则从 P 搜索。

这是一个递归过程。因此,注释说“仅当单次搜索什么都找不到时,结果才会有所不同。”

而对于“仅当 N 是转换函数 ID 时结果不同”,由于以下规则:

在每个考虑类 S 的转换函数来初始化类型 T 的对象或引用的情况下,候选函数包括在 S 中搜索转换函数 ID 运算符 T 的结果。

这并不意味着名称“operator T”是转换函数唯一要查找的名称,“允许的类型”也是根据相关规则查找的候选者。

每个这样的情况还定义了显式和非显式转换函数的允许类型集;

无论如何,该注释用于说明“单一搜索”的例外情况,它不应该通过单一搜索找到任何声明,但其他候选方式会找到它们。

于 2021-06-09T02:13:24.847 回答