以下代码在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也是如此。我正在阅读标准中的朋友章节,我无法找到一个可以确认或反驳此条款的条款。
这是合法的,如果是的话,那章和章节是什么?
答案 0 :(得分:3)
[class.access.nest] / 1 声明
嵌套类是成员,因此具有与任何其他成员相同的访问权限
所以我相信是的,这是标准行为。
让我们说Outer
有一个成员函数foo()
。当然,该功能可以访问Bob
个成员。据我所知,我引用的部分暗示Outer
内的任何嵌套类都具有与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
};
};