C++类成员名称查找规则中注1是什么意思?
来自http://eel.is/c++draft/class.member.lookup#1:
甲搜索在范围
X为名称N从程序点P是在单个搜索X用于N从P除非X是一个类或类模板的范围T,在这种情况下,下面的步骤定义搜索的结果。[注 1:结果只有在
N是转换函数 id或单次搜索找不到任何东西时才会有所不同。—尾注]
我很难理解 Note。似乎从类范围中进行“单一搜索”会在名称空间范围内找到前面的声明,因为名称空间范围包含类范围。但是,正如我们所知,如果名称也被声明为非依赖基类的成员,则基类成员优先于命名空间成员。Note 1似乎与此相矛盾,因为它基本上是在说“如果N不是转换函数 ID,那么您可以只进行普通的单一搜索,并且只有在找不到任何内容时,才使用本节中的过程”。但是单次搜索将通过找到命名空间范围声明而成功,而类成员查找将产生不同的结果。
我的理解错误在哪里?
回答
回答
甲单个搜索仅考虑一个范围而不是一个封闭命名空间或甚至一个基类。这是一个考虑所有封闭范围的非限定搜索。单次搜索和(普通)搜索是这些高级过程的子程序。
语境
应该说,由于最近有很多这样的问题,这些术语的存在是为了减少“程序员级别”结构(如(非)限定名称查找)的定义中的歧义和不精确(例如,CWG 问题 191)。我发明它们并不是为了增加典型程序员应该记住的词汇量。(换句话说,标准不是教程。)
当然,这个特定问题在这方面没有什么特别之处,但我必须希望这会因此而倾向于找到需要查看它的人。