哪个范围属于课堂定义的朋友函数

Which scope does an in-class-defined friend function belong to?

本文关键字:朋友 函数 定义 课堂 范围 属于      更新时间:2023-10-16
class A {
    friend void f() {}
};
// void f() {}  // compile error: redifinition of 'void f()'
int main() {
    f();  // compile error: 'f' is not declared in this scope
}

您在上面的示例中可以看到,如果fA的封闭命名空间范围中调用,则编译器无法找到f,这使我想到f不在此范围中。但是,当添加具有相同签名功能的函数的定义时,编译器会发出功能重新定义的错误,这给了我相反的想法,即f实际上在此范围内。

所以,我很困惑哪个范围属于上课定义的朋友功能属于。

它在包含类的名称空间中。

但是,如果仅在班级中声明,则仅通过参数依赖性查找才能获得。因此,这将起作用,参数类型A在周围名称空间中查找f

class A {
    friend void f(A) {}
};
int main() {
    f(A());    // OK: uses ADL
    ::f(A());  // Error: doesn't use ADL, and can't find the name without it
}

这通常用于超载运算符,无论如何只能由ADL找到。

,如果您声明而不是重新定义,则您的版本将有效。

在名称空间范围内
void f();

只能在类中声明而不是定义的朋友函数。例如。朋友void f();