我有一个有朋友功能的类,例如,如果标题是:
class A{
friend void foo();
public:
A(){}
};
void foo();
那么我无法得到的是编译器对第二个声明做了什么?
我都注意到我可以写多少我想写多少都没有效果,例如
void foo();
void foo();
...
(假设实现在cpp文件中)
另外,我找不到标准在哪里说将某些函数声明为朋友也声明了函数本身。
friend void foo();
这种清除只是告诉编译器你在某个地方有一个函数void foo()
,并且该函数将能够访问你的类的所有成员。你写了多少次:
void foo();
void foo();
这不会生效,因为这是未定义的foo()
原型foo()
。在某个地方你必须写一个主体,foo()
否则任何调用foo()
都会失败
如果该friend
声明是唯一的声明,则该函数将在周围的命名空间中,但无法通过正常的查找规则找到;它只能通过参数相关查找找到。
在这种情况下,这意味着根本找不到它,因为没有参数;因此您还需要在命名空间中声明以使其可访问。
有时你想要那种行为;例如,ADL 可以找到流操作符,而无需在命名空间中声明它:
struct A {
friend std::ostream & operator<<(std::ostream & s, A const & a) {
return s << "Hello";
}
};
A a;
std::cout << a; // finds the friend function by ADL, based on the argument 'a'
我都注意到我可以写多少我想写多少都没有效果
是的,您可以根据需要多次重复声明。
另外,我找不到标准在哪里说将某些函数声明为朋友也声明了函数本身。
无论声明是否包含friend
说明符,大多数声明规范(C++11 第 7 条)都是相同的。7.3.1.2/3 指定名称在命名空间中,而不是在类中,还指定了查找规则。