类内定义的友元函数属于哪个作用域?

2024-05-11

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
}

正如您在上面的示例中看到的,如果f被叫进A的封闭命名空间范围,编译器无法找到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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类内定义的友元函数属于哪个作用域? 的相关文章