嵌套类是否获得外部类的友谊关系?

时间:2017-08-03 15:04:11

标签: c++ friend

#include <iostream>
#include <string>

class A {
    friend class B;
    std::string m = "Hello";
};

struct B {
    struct N {
        void f(){
            A a;
            std::cout << a.m << std::endl;
        };
    };
};

int main() {
    B::N().f();
}

是否允许N访问m?

修改

好的,我在cpp.sh中运行它,显然它可以工作。是否有一个通用的规则来理解如何获得友谊关系?

1 个答案:

答案 0 :(得分:4)

标准很清楚,友谊不是继承的:

  14.3 / 10:“友谊既不是继承也不是传递”

但是嵌套类是不是继承。它是会员。如果一个班级是朋友,其成员可以访问该班级的朋友。因此,内部/嵌套类具有访问权限。

直接遵守标准:

  

14.3 / 2宣布一个班级成为朋友意味着来自授予友谊的班级的私人和受保护成员的名字可以   可以在。的基本说明符和成员声明中访问   结识班。例如:

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