C++class成员名查找规则中注1是什么意思?
What is the meaning of Note 1 in the C++ class member name lookup rules?
来自 http://eel.is/c++draft/class.member.lookup#1 :
A search in a scope X
for a name N
from a program point P is a single search in X
for N
from P
unless X
is the scope of a class or class template T
, in which case the following steps define the result of the search.
[Note 1: The result differs only if N
is a conversion-function-id or if the single search would find nothing. — end note]
我很难理解 Note。似乎来自 class 范围的“单一搜索”将在名称空间范围内找到前面的声明,因为名称空间范围包含 class 范围。但是,正如我们所知,如果名称也被声明为非依赖基 class 的成员,则基 class 成员优先于命名空间成员。 注释 1 似乎与此相矛盾,因为它基本上是在说“如果 N
不是转换函数 ID,那么您可以进行正常的单一搜索,并且仅当如果找不到任何东西,请使用本节中的过程”。但是通过查找名称空间范围声明,单个搜索将成功,并且 class 成员查找将产生不同的结果。
我的理解哪里出错了?
回答
单一搜索 只考虑 一个 范围——不是封闭的命名空间,甚至不是基础 class。这是考虑所有封闭范围的 unqualified 搜索。单一搜索和(普通)搜索 是这些高级过程的 子例程。
上下文
应该说,由于最近有很多这样的问题,所以这些术语的存在是为了减少歧义和不精确(例如,CWG issue 191) in the definitions of “programmer-level” constructs like (un)qualified name lookup. I didn’t invent them以增加一般程序员应该记住的词汇个单词的数量。(换句话说,标准不是教程。)
当然,这个问题在这方面并没有什么特别之处,但我希望这将有助于找到需要它的人。
“单一搜索”的目的是说明查找应该如何为成员执行。简单来说,如果使用单次搜索在命名空间的作用域中查找成员,由于这里的单次搜索,如果还没有找到声明,它的封闭作用域将不会被继续找到.
按照你在此处引用的规则,class或class模板的范围是“单一搜索”的例外,这意味着单一搜索应继续执行如果还没有找到它的基础 classes。
The declaration set is the result of a single search in the scope of C for N from immediately after the class-specifier of C if P is in a complete-class context of C or from P otherwise.
这是一个递归过程。因此,注释说“只有在单次搜索什么也找不到时,结果才会不同。”
而对于“仅当 N 是转换函数 ID 时结果不同”,因为以下规则:
In each case where conversion functions of a class S are considered for initializing an object or reference of type T, the candidate functions include the result of a search for the conversion-function-id operator T in S.
这并不意味着名称“operator T”是要为转换函数查找的唯一名称,“允许的类型”也是根据以下内容查找的候选者相关规则。
Each such case also defines sets of permissible types for explicit and non-explicit conversion functions;
无论如何,该注释用于说明“单一搜索”的例外情况,它不应该通过 单一搜索 找到任何声明,但其他候选方法会找到他们。
来自 http://eel.is/c++draft/class.member.lookup#1 :
A search in a scope
X
for a nameN
from a program point P is a single search inX
forN
fromP
unlessX
is the scope of a class or class templateT
, in which case the following steps define the result of the search.[Note 1: The result differs only if
N
is a conversion-function-id or if the single search would find nothing. — end note]
我很难理解 Note。似乎来自 class 范围的“单一搜索”将在名称空间范围内找到前面的声明,因为名称空间范围包含 class 范围。但是,正如我们所知,如果名称也被声明为非依赖基 class 的成员,则基 class 成员优先于命名空间成员。 注释 1 似乎与此相矛盾,因为它基本上是在说“如果 N
不是转换函数 ID,那么您可以进行正常的单一搜索,并且仅当如果找不到任何东西,请使用本节中的过程”。但是通过查找名称空间范围声明,单个搜索将成功,并且 class 成员查找将产生不同的结果。
我的理解哪里出错了?
回答
单一搜索 只考虑 一个 范围——不是封闭的命名空间,甚至不是基础 class。这是考虑所有封闭范围的 unqualified 搜索。单一搜索和(普通)搜索 是这些高级过程的 子例程。
上下文
应该说,由于最近有很多这样的问题,所以这些术语的存在是为了减少歧义和不精确(例如,CWG issue 191) in the definitions of “programmer-level” constructs like (un)qualified name lookup. I didn’t invent them以增加一般程序员应该记住的词汇个单词的数量。(换句话说,标准不是教程。)
当然,这个问题在这方面并没有什么特别之处,但我希望这将有助于找到需要它的人。
“单一搜索”的目的是说明查找应该如何为成员执行。简单来说,如果使用单次搜索在命名空间的作用域中查找成员,由于这里的单次搜索,如果还没有找到声明,它的封闭作用域将不会被继续找到.
按照你在此处引用的规则,class或class模板的范围是“单一搜索”的例外,这意味着单一搜索应继续执行如果还没有找到它的基础 classes。
The declaration set is the result of a single search in the scope of C for N from immediately after the class-specifier of C if P is in a complete-class context of C or from P otherwise.
这是一个递归过程。因此,注释说“只有在单次搜索什么也找不到时,结果才会不同。”
而对于“仅当 N 是转换函数 ID 时结果不同”,因为以下规则:
In each case where conversion functions of a class S are considered for initializing an object or reference of type T, the candidate functions include the result of a search for the conversion-function-id operator T in S.
这并不意味着名称“operator T”是要为转换函数查找的唯一名称,“允许的类型”也是根据以下内容查找的候选者相关规则。
Each such case also defines sets of permissible types for explicit and non-explicit conversion functions;
无论如何,该注释用于说明“单一搜索”的例外情况,它不应该通过 单一搜索 找到任何声明,但其他候选方法会找到他们。