问题描述
下面的所有标准参考均引用N4659: March 2017 post-Kona working draft/C++17 DIS。
声明为好友的函数也可以在好友声明中定义,如下所示:
#include <iostream>
namespace a {
struct A {
// Definition of 'a::foo()'
friend void foo() { std::cout << __PRETTY_FUNCTION__; }
};
} // namespace a
诸如a::foo()
之类的功能(有时称为“隐藏的朋友”)无法通过不合格或合格的查找来找到:
int main() {
a::foo(); // error: no member named 'foo' in namespace 'a'
}
根据[basic.lookup.argdep]/4可以找到,但是可以通过ADL [强调我的]:
考虑关联命名空间时,查找与 当关联的名称空间用作 限定符([namespace.qual]),除了:
- [...]
- 在关联类中声明的任何命名空间范围的朋友功能或朋友功能模板 相应的名称空间,即使它们在普通情况下不可见 查找([class.friend])。
- [...]
专门基于ADL定义的类类型:
#include <iostream>
namespace a {
struct A {
friend void foo(const A&) { std::cout << __PRETTY_FUNCTION__; }
};
} // namespace a
int main() {
foo(a::A{}); // void a::foo(const a::A &)
}
但是,如果我们在定义它的类的名称空间范围内(重新)声明该函数,则可以通过限定/不限定查找来找到该函数:
#include <iostream>
namespace a {
struct A {
friend void foo() { std::cout << __PRETTY_FUNCTION__; }
};
void foo();
} // namespace a
int main() {
a::foo(); // void a::foo()
}
问题
- 哪些规范性文本规定了在非ADL查找中只能在封闭的名称空间中声明一次(重新)才能找到一个类中定义的朋友?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)