本文主要是介绍友元声明与实参相关的查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
当类声明了一个友元时,该友元声明并没有使得友元本身可见。然而,一个另外的未声明的类或函数如果第一次出现在友元声明中,则我们认为它是最近的外层命名空间的成员。这条规则与实参相关的查找规则结合在一起将产生意想不到的效果:
namespace
{class C{// 两个友元,在友元声明之外没有其他的声明// 这些函数隐式地成为命名空间A的成员friend void f2();// 除非另有声明,否则不会被找到friend void f(const C&);// 根据实参相关的查找规则可以被找到};
}
此时,f和f2都是命名空间A的成员。即使f不存在其他声明,我们也能通过实参相关的查找规则调用f:
int main()
{A::C cobj;f(cobj);// 正确:通过在A::C中的友元声明找到A::ff2();// 错误:找不到A::f2
}
因为f接受一个类类型的实参,而且f在C所属的命名空间进行隐式的声明,所以f能被找到。相反,因为f2没有形参,所以它无法被找到。
这篇关于友元声明与实参相关的查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!