C++ 友元声明及其表示的实体

C++ 友元声明及其表示的实体,c++,class,friend,C++,Class,Friend,我有一个关于friend函数/类的问题。考虑下面的代码: #include <iostream> struct A { private: int a = 5; friend int foo(A a); }; int foo(A a) { return a.a; } int a = foo(A()); int main(){ std::cout << a << std::endl; } 我在标准中找不到对此的解释。它说的是N3

我有一个关于friend函数/类的问题。考虑下面的代码:

#include <iostream>

struct A
{
private:
    int a = 5;
    friend int foo(A a);
};

int foo(A a)
{
    return a.a;
}

int a = foo(A());

int main(){ std::cout << a << std::endl; }

我在标准中找不到对此的解释。它说的是
N3797:11.3/6[class.friend]

函数可以在类的友元声明中定义,如果和 仅当类是非本地类(9.8)时,函数名为 不合格,且函数具有命名空间范围

因此,它解释了以下代码工作正常的原因:

#include <iostream>

struct A
{
private:
    int a = 5;
    friend int foo(A a)
    {
        return a.a;
    }
};

int a = foo(A());

int main(){ std::cout << a << std::endl; }
#包括
结构A
{
私人:
INTA=5;
傅友友(A)
{
返回a.a;
}
};
int a=foo(a());
最后一个程序中的int main(){std::cout

#include <iostream>

struct A
{
private:
    int a = 5;
    friend int foo(A a)
    {
        return a.a;
    }
};

int a = foo(A());

int main(){ std::cout << a << std::endl; }
但是,如果在定义类的作用域中添加函数声明,编译器将看到该函数

#include <iostream>

struct A
{
public:
    A( int x ) : a( 2 * x ) {}

private:
    int a;
    friend int foo( int x )
    {
        A a( x );

        return a.a;
    }
};

int foo( int );

int a = foo( 10 );


int main() 
{
    std::cout << a << std::endl;

    return 0;
}

[namespace.memdef]/p3@T.C.一如既往,非常有帮助,谢谢。
#include <iostream>

struct A
{
public:
    A( int x ) : a( 2 * x ) {}

private:
    int a;
    friend int foo( int x )
    {
        A a( x );

        return a.a;
    }
};

int a = foo( 10 );


int main() 
{
    std::cout << a << std::endl;

    return 0;
}
#include <iostream>

struct A
{
public:
    A( int x ) : a( 2 * x ) {}

private:
    int a;
    friend int foo( int x )
    {
        A a( x );

        return a.a;
    }
};

int foo( int );

int a = foo( 10 );


int main() 
{
    std::cout << a << std::endl;

    return 0;
}
20