微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++类成员名称查找规则中注1是什么意思?

如何解决C++类成员名称查找规则中注1是什么意思?

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

从程序点P在范围X中对名称N搜索X中的单个搜索对于 N from P 除非 X 是类或类模板 T 的范围,在这种情况下,以下步骤定义搜索结果

[注意 1:仅当 Nconversion-function-id 或单次搜索找不到任何结果时,结果才会不同。 — 尾注]

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

我理解的错误在哪里?

解决方法

答案

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

背景

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

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

,

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

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

>

声明集是在 C 的范围内单次搜索的结果,如果 P 位于 C 的完整类上下文中或来自 P 的类说明符,则紧跟在 C 的类说明符之后否则。

这是一个递归过程。因此,注释上写着“只有在单次搜索找不到任何东西时,结果才会有所不同。”

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。