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(使用前将#替换为@)