引入了参数相关查找,用于所有函数的非限定名称查找,而不仅仅是类的友元函数。
这是一个演示程序
#include <iostream>
namespace N1
{
struct A
{
int a = 10;
friend void f( A &a ) { std::cout << "friend f( A & ) : A::a = " << a.a << '\n'; }
};
void f( const A &a ) { std::cout << "f( const A & ) : A::a = " << a.a << '\n'; }
}
int main()
{
N1::A a1;
f( a1 );
const N1::A a2;
f( a2 );
N1::f( a1 );
}
程序输出为
friend f( A & ) : A::a = 10
f( const A & ) : A::a = 10
f( const A & ) : A::a = 10
在这个程序中,当限定名称查找用于以名称 f 和非常量对象 a1 作为其参数的函数时,称为非友元函数 f,因为友元函数 f 的名称在其所在的命名空间中是不可见的。引入声明。
友元函数包含在 ADL 中,因为如果友元函数仅在类中声明(并相应地定义),则其名称在与在命名空间中声明的函数相反的位置引入声明的命名空间中是不可见的。因此,例如非友元函数可以使用限定名称调用,而仅在类中声明的友元函数不能使用限定名称调用,因为它们是不可见的。
要使用非友元函数实现相同的操作,您必须首先使它们在引入它们的声明的命名空间中不可见,并且限定名称查找不应找到它们。如果不在 C++ 标准中引入一些新概念,这是不可能的。