对于以下代码段:
class A{
friend void f(){};
public:
A(){f();} //error
};
class B{
friend void f(void* ptr){};
public:
B(){f(this);} //no error
};
根据规则虽然朋友的功能可以在一个类中定义,但是只有在声明在类范围之外的某个地方之后它们才可见,错误在解释了A类的定义 但我很困惑,为什么B类的片段不会产生与A类相同的错误。
请有人能告诉我这个吗?
答案 0 :(得分:16)
“不可见”有点过分简化。仅使用类内定义时,无法通过限定或非限定查找找到友元函数,这就是第一个代码段失败的原因。
但是,可以通过参数依赖查找(ADL)找到它,因此您可以使用涉及与函数位于同一名称空间中的类型的参数来调用它。
在这种情况下,参数类型为B*
,其范围在全局命名空间中。 friend函数的范围限定在包含声明它的类的命名空间中 - 也是全局命名空间。因此,ADL将在全局命名空间中查找名为f
的函数,找到友元函数,然后使用它。