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