3

以下代码在 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 也是自动的。我正在阅读标准的“朋友”一章,但找不到可以确认或反驳这一点的条款。

这是否合法,如果是,章节和经文是什么?

4

1 回答 1

3

[class.access.nest]/1指出

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

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

假设它Outer有一个成员函数foo()。当然,该功能将有权访问Bob's 成员。据我了解,我引用的部分意味着内部的任何嵌套类Outer都将具有与 相同的访问权限foo(),因此能够访问Bob的成员。

还值得注意的是,该标准包含以下示例([class.friend]/2A::B ),请注意in的用法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
    };
};
于 2017-03-21T11:57:22.263 回答