C++ 是否可能有一个只能由ADL找到的非友元函数?

C++ 是否可能有一个只能由ADL找到的非友元函数?,c++,declaration,friend-function,name-lookup,unqualified-name,C++,Declaration,Friend Function,Name Lookup,Unqualified Name,C++有一个特性,即类内定义的友元函数只能通过ADL(参数相关查找)找到: 对于非友元函数是否可以实现相同的功能?我问这个问题,因为有时候,我希望有这个“仅由ADL查找”功能,但实际上我不需要朋友访问类内部 (还有一个有点自以为是的问题:如果这不可能,原因是什么?这条“仅由ADL发现”规则是故意设计到语言中的吗?这只可能用于友元函数,因为它们是唯一存在这种说法的函数。使函数对普通名称查找不可见的措辞,以及在ADL期间考虑函数的措辞,都只适用于这样的朋友 这个特性实际上是用来取代另一个被认为问题更

C++有一个特性,即类内定义的友元函数只能通过ADL(参数相关查找)找到:

对于非友元函数是否可以实现相同的功能?我问这个问题,因为有时候,我希望有这个“仅由ADL查找”功能,但实际上我不需要朋友访问类内部


(还有一个有点自以为是的问题:如果这不可能,原因是什么?这条“仅由ADL发现”规则是故意设计到语言中的吗?

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

这个特性实际上是用来取代另一个被认为问题更大的特性。这是一份详细的报纸。模板用于在实例化模板时将其友元函数名注入作用域,通过常规名称查找找到。这是不理想的,导致了过载解决问题

该功能被设置为删除,但它是的主干,因此提出了一个解决方案,最终成为我们所知的仅由ADL查找的内联友元函数。它是为简化编程习惯而定制的


由于自年以来没有提出其他需要这种行为的广泛使用的习惯用法,因此这种行为没有扩展到非友元函数。

引入了参数相关查找,用于所有函数的非限定名称查找,而不仅仅是类的友元函数

这是一个演示程序

#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 );
}    
在该程序中,当限定名称查找用于名为f且非常量对象a1作为其参数的函数时,称为非友元函数f,因为友元函数f的名称在引入其声明的命名空间中不可见

ADL中包含友元函数,因为如果仅在类中声明(并相应定义)友元函数,则其名称在命名空间中不可见,在命名空间中,该声明与在命名空间中声明的函数相对。例如,非友元函数可以使用限定名调用,而仅在类中声明的友元函数不能使用限定名调用,因为它们是不可见的


要对非友元函数实现相同的操作,首先必须使它们在引入其声明的命名空间中不可见,并且限定名称查找不会找到它们。在C++标准中引入一些新的概念是不可能的。p> 可能不会。通常,
friend
关键字的唯一原因是使函数仅为ADL。
#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