c++ - 一些 friend 功能不遵守规则

标签 c++ friend

对于以下代码段:

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/

相关文章:

c++ - 使用工厂 friend 类来分配新类,好的做法?

c++ - 在 C++ 中使用非友元方法重载 I/O 运算符 | &istream 和 &ostream 函数

c++ - 是否可以调用注入(inject)的 friend 模板函数?

c++ - 为什么我的控制台窗口在我的程序完成之前就关闭了?

java - 使用 C++ 时,Eclipe 是否需要 JDK?

C++ 不匹配运算符*

c++ - 在 C++ 中反转单链表

c++ - 为什么模板函数不能是模板类的友元模板函数?

C++ 模板友元函数不链接

c++ - 使用 eigen3/sparse 的稀疏特征值