对于以下代码段:
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 类相同的错误。
谁能告诉我这个?
最佳答案
“不可见”有点过于简单化了。只有类内定义,无法通过限定或非限定查找找到友元函数,这就是第一个片段失败的原因。
但是,它可以通过 依赖于参数的查找 (ADL) 找到,因此您可以使用涉及范围与函数在同一命名空间中的类型的参数来调用它。
在这种情况下,参数类型是 B*
,范围在全局命名空间中。友元函数的作用域是包含声明它的类的命名空间——也是全局命名空间。因此 ADL 将在全局命名空间中查找名为 f
的函数,找到友元函数并使用它。
关于c++ - 一些 friend 功能不遵守规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721163/