【问题标题】:What is the meaning of Note 1 in the C++ class member name lookup rules?C++类成员名查找规则中注1是什么意思?
【发布时间】:2021-08-19 02:34:55
【问题描述】:

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

X 范围内搜索程序点中的名称NP 是在X 中从@ 中搜索N 987654326@ 除非X 是类或类模板T 的范围,在这种情况下,以下步骤定义搜索结果。

[注 1:只有当 Nconversion-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


【解决方案1】:

“单次搜索”的目的是说明应该如何对成员进行查找。简单来说,如果在命名空间范围内使用单次搜索查找成员,则由于此处的单次搜索,如果还没有找到声明,则不会继续查找其封闭范围。 p>

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

声明集是在 C 范围内单次搜索的结果,如果 P 在 C 的完整类上下文中或从 P否则。

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

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

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

不代表“operator T”这个名字是转换函数要查找的唯一名称,“允许的类型”也是按照相关规则查找的候选。

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

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

【讨论】:

    【解决方案2】:

    回答

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

    上下文

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

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

    【讨论】:

    • 感谢权威解答。如果我没有忽略 [basic.lookup.unqual]/2 末尾的句子,这对我来说会更有意义。但我仍然认为措辞需要改进。我将对此问题添加另一条评论,因为那里已经有一个线程。
    • @LanguageLawyer:也许不会:/4 在完整类上下文中更改查找点。
    • 这就是我的想法。但决定三重检查并删除评论。单次搜索可能会发现一些重载,这不是什么都没有,这仍然不同于在完整的类上下文中查找所有重载的结果。
    猜你喜欢
    • 1970-01-01
    • 2014-08-27
    • 2019-09-27
    • 2010-12-28
    • 1970-01-01
    • 2015-10-18
    • 2011-10-14
    • 2021-12-24
    相关资源
    最近更新 更多