C++ 友元声明及其表示的实体
我有一个关于friend函数/类的问题。考虑下面的代码: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
#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