c++ - 是否可以拥有只能由 ADL 找到的非好友功能?
问题描述
C++ 有一个特性,即类内定义的友元函数只能通过 ADL(参数相关查找)找到:
struct Foo {
friend void fn(Foo) { } // fn can only be called by ADL, it won't be found by other lookup methods
};
非朋友功能是否可以实现相同的功能?我问这个,因为有时,我想拥有这个“仅由 ADL 发现”的功能,但我实际上并不需要朋友访问课程内部。
(还有一个有点自以为是的问题:如果这不可能,这是什么原因?这个“只有 ADL 发现”规则是故意设计到语言中的吗?)
解决方案
只有友元函数才有可能,因为它们是唯一存在这种说法的函数。使函数对普通名称查找不可见的措辞以及在 ADL 期间考虑它们的措辞都仅适用于此类朋友。
引入此功能实际上是为了替换另一个被认为更成问题的功能。N0777是详细说明它的论文。模板用于在模板实例化时将其友元函数名称注入范围,以便通过常规名称查找找到。这并不理想,并导致过载解决问题。
该功能被设置为删除,但它是Barton-Nackman 技巧的支柱,因此提出了一个解决方案,最终成为我们所知的仅由 ADL 查找的内联友元函数。它是为方便编程习惯而量身定制的。
由于此后没有提出需要这种行为的其他广泛传播的习语,因此这种行为没有扩展到非朋友功能。
推荐阅读
- python - 当表已经存在时,Dataframe to_sql 等待很长时间
- swift - macOS NSTextField,NSStackView,NSScrollView 如何在可滚动列表中实现包裹文本?
- php - PHP AJAX Jquery 日历需要重置 beforeShowDay 值吗?
- r - 在多列 R 中查找具有最多匹配的列
- javascript - 等待 Firestore 集合/文档上的循环结束,然后在 Node.js 中发送输出
- angular - mat-tab 标签 flex wrap 响应式
- node.js - nativescript-socketio 未连接到 Node Js 服务器
- go - Windows exec runner 无法克隆 git repo
- javascript - WebGLInput.captureAllKeyboardInput 奇怪的行为。可以启用,但不能禁用
- java - 使用 java split 从文件中解析日期