哪些规范性文本规定了在非ADL查找中只能在封闭的名称空间中声明一次重新才能找到一个在类中定义的朋友? 问题朋友声明无论是否定义不会在封闭的名称空间中引入新名称

问题描述

下面的所有标准参考均引用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 (将#修改为@)