朋友的功能和声明

时间:2013-09-09 17:13:46

标签: c++ c++11 friend

如果标题是:

,我有一个有朋友功能的课程
 class A{
       friend void foo();
       public:
             A(){}
 };

 void foo();

所以我不能得到的是编译器对第二个声明做了什么?

我已经注意到我可以按照我想要的方式编写尽可能多的内容,例如

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

(假设实现在cpp文件中)

另外,我无法找到标准所说的声明某些功能的朋友也声明了该功能本身。

2 个答案:

答案 0 :(得分:2)

friend void foo();

这个declearation只是告诉编译器某个地方你有一个函数void foo(),该函数将能够访问你班级的所有成员。 你写了多少次:

void foo();
void foo();

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

答案 1 :(得分:2)

如果friend声明是 only 声明,则该函数将位于周围的命名空间中,但正常的查找规则无法找到;它只能通过参数依赖查找找到。

在这种情况下,这意味着它根本找不到,因为没有参数;因此,您还需要在命名空间中使用声明才能使其可访问。

有时你想要这种行为;例如,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'
  

我已经注意到我可以按照我想要的方式编写尽可能多的内容

是的,您可以根据需要多次重复声明。

  

另外,我无法找到标准所说的声明某些功能的朋友也声明了该功能本身。

声明的大多数规范(C ++ 11第7节)都是相同的,无论声明是否包含friend说明符。 7.3.1.2/3指定名称在名称空间中,而不是类,并指定查找规则。