如果class外是我的朋友,class Outer::Inner也是吗?
If class Outer is my friend, is class Outer::Inner too?
以下代码可在 MSVC 上编译:
#include <iostream>
class Bob
{
int a;
friend class Outer;
};
class Outer
{
class Inner
{
void f(Bob obj)
{
std::cout << obj.a; //OK
}
};
};
所以看起来如果 Outer 是 Bob 的朋友,那么 Inner 也是自动的。我正在阅读标准的 Friends 章节,但找不到可以证实或反驳这一点的条款。
这是合法的吗?如果是的话,章节是什么?
[class.access.nest]/1 指出
A nested class is a member and as such has the same access rights as any other member
所以我相信是的,这是标准行为。
假设 Outer
有一个成员函数 foo()
。当然,该函数将有权访问 Bob
的成员。据我了解,我引用的部分暗示 Outer
中的任何嵌套 class 都将具有与 foo()
相同的访问权限,因此能够访问 Bob
的成员。
还值得注意的是,该标准包含以下示例([class.friend]/2),注意A::B
在Y
:
class A {
class B { };
friend class X;
};
struct X : A::B {
// OK: A::B accessible to friend
A::B mx; // OK: A::B accessible to member of friend
class Y {
A::B my; // OK: A::B accessible to nested member of friend
};
};
以下代码可在 MSVC 上编译:
#include <iostream>
class Bob
{
int a;
friend class Outer;
};
class Outer
{
class Inner
{
void f(Bob obj)
{
std::cout << obj.a; //OK
}
};
};
所以看起来如果 Outer 是 Bob 的朋友,那么 Inner 也是自动的。我正在阅读标准的 Friends 章节,但找不到可以证实或反驳这一点的条款。
这是合法的吗?如果是的话,章节是什么?
[class.access.nest]/1 指出
A nested class is a member and as such has the same access rights as any other member
所以我相信是的,这是标准行为。
假设 Outer
有一个成员函数 foo()
。当然,该函数将有权访问 Bob
的成员。据我了解,我引用的部分暗示 Outer
中的任何嵌套 class 都将具有与 foo()
相同的访问权限,因此能够访问 Bob
的成员。
还值得注意的是,该标准包含以下示例([class.friend]/2),注意A::B
在Y
:
class A {
class B { };
friend class X;
};
struct X : A::B {
// OK: A::B accessible to friend
A::B mx; // OK: A::B accessible to member of friend
class Y {
A::B my; // OK: A::B accessible to nested member of friend
};
};