1

我有一个有朋友功能的类,例如,如果标题是:

 class A{
       friend void foo();
       public:
             A(){}
 };

 void foo();

那么我无法得到的是编译器对第二个声明做了什么?

我都注意到我可以写多少我想写多少都没有效果,例如

void foo();
void foo();
...

(假设实现在cpp文件中)

另外,我找不到标准在哪里说将某些函数声明为朋友也声明了函数本身。

4

2 回答 2

2
friend void foo();

这种清除只是告诉编译器你在某个地方有一个函数void foo(),并且该函数将能够访问你的类的所有成员。你写了多少次:

void foo();
void foo();

这不会生效,因为这是未定义的foo()原型foo()。在某个地方你必须写一个主体,foo()否则任何调用foo()都会失败

于 2013-09-09T17:21:41.410 回答
2

如果该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 指定名称在命名空间中,而不是在类中,还指定了查找规则。

于 2013-09-09T17:21:53.377 回答