如果Outer班是我的朋友,那么类Outer :: Inner呢?

时间:2017-03-21 11:51:12

标签: c++ language-lawyer friend member-access

以下代码在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也是如此。我正在阅读标准中的朋友章节,我无法找到一个可以确认或反驳此条款的条款。

这是合法的,如果是的话,那章和章节是什么?

1 个答案:

答案 0 :(得分:3)

[class.access.nest] / 1 声明

  

嵌套类是成员,因此具有与任何其他成员相同的访问权限

所以我相信是的,这是标准行为。

让我们说Outer有一个成员函数foo()。当然,该功能可以访问Bob个成员。据我所知,我引用的部分暗示Outer内的任何嵌套类都具有与foo()相同的访问权限,因此可以访问Bob成员。

值得注意的是,该标准包含以下示例( [class.friend] / 2 ),请注意A::BY的用法:

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
    };
};