首页 > 解决方案 > 是否可以拥有只能由 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 发现”规则是故意设计到语言中的吗?)

标签: c++declarationfriend-functionname-lookupunqualified-name

解决方案


只有友元函数才有可能,因为它们是唯一存在这种说法的函数。使函数对普通名称查找不可见的措辞以及在 ADL 期间考虑它们的措辞都仅适用于此类朋友。

引入此功能实际上是为了替换另一个被认为更成问题的功能。N0777是详细说明它的论文。模板用于在模板实例化时将其友元函数名称注入范围,以便通过常规名称查找找到。这并不理想,并导致过载解决问题。

该功能被设置为删除,但它是Barton-Nackman 技巧的支柱,因此提出了一个解决方案,最终成为我们所知的仅由 ADL 查找的内联友元函数。它是为方便编程习惯而量身定制的。

由于此后没有提出需要这种行为的其他广泛传播的习语,因此这种行为没有扩展到非朋友功能。


推荐阅读