C++中的内部类会自动成为朋友吗?

cyej8jka  于 2023-05-24  发布在  其他
关注(0)|答案(5)|浏览(157)

如果我在C++中定义了一个内部类,它会自动成为包含它的类的友元吗?例如,这是否法律的:

class Outer {
public:
    class Inner {
    public:
        void mutateOuter(Outer& o);
    };

private:
    int value;
};

void Outer::Inner::mutateOuter(Outer& o) {
    o.value ++; // Legal?  Or not?
}

我这样问是因为在我试过的一些编译器(VS2003)上,这段代码不能工作,但我听说它在一些编译器上可以工作。我在C++规范中找不到相关的章节,如果有人能引用一些具体的东西来说明它是合法的还是不法律的的,那就太好了。

2ul0zpep

2ul0zpep1#

在我自己问过或多或少相同的问题here之后,我想分享(显然)C++11的更新答案:
引用自https://stackoverflow.com/a/14759027/1984137
标准$11.7.1
“嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则”
并且通常的访问规则规定:
“类的成员也可以访问该类有权访问的所有名称...”
标准中给出了具体的例子:

class E {
    int x;
    class B { };

    class I {
        B b; // OK: E::I can access E::B
        int y;
        void f(E* p, int i) {
            p->x = i; // OK: E::I can access E::x
        }
    };
}
wmomyfyw

wmomyfyw2#

直到C11(即C98和C++03):不知道

在C98和C03中,嵌套类默认不能访问封闭类的privateprotected成员。
C++ Standard(2003)在$11.8/1 [class.access.nest]中说:

嵌套类的成员对封闭类的成员没有特殊的访问权限,也不能访问已将友谊授予封闭类的类或函数;应遵守通常的访问规则(第11条)。**封闭类的成员对嵌套类的成员没有特殊的访问权限;**应遵守通常的访问规则(第11条)。

标准本身的例子:

class E 
{
    int x;
    class B { };
    class I 
    {
        B b; // error: E::B is private
        int y;
        void f(E* p, int i)
        {
           p->x = i; // error: E::x is private
        }
   };
   int g(I* p)
   {
       return p->y; // error: I::y is private
   }
};

C++11起:是的

上述限制自C++11起已被删除。现在嵌套类可以访问封闭类的privateprotected成员:

class E 
{
    int x;
    class B { };
    class I 
    {
        B b; // ok: even though E::B is private
        int y;
        void f(E* p, int i)
        {
           p->x = i; // ok: even though E::x is private
        }
   };
   int g(I* p)
   {
       return p->y; // ok: even though I::y is private
   }
};

希望能帮上忙。

r7xajy2e

r7xajy2e3#

该标准似乎改变了关于可访问性的规范。
C98中的§11.8/1规定:
嵌套类的成员对封闭类的成员没有特殊的访问权限,也不能访问已将友谊授予封闭类的类或函数;应遵守通常的访问规则。
N1804中的§11.8/1(TR 1之后)规定:
嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。
我认为当前的C
编译器遵循较新的规范。

izj3ouym

izj3ouym4#

**此答案与(过时的)C++03规范有关。**此问题的公认答案更符合最新情况。

好吧,我觉得现在问这个问题很愚蠢,因为我刚刚找到了规范中涵盖这一点的相关部分:§11.8/1:

**嵌套类的成员对封闭类的成员没有特殊的访问权限,也不能访问已将友谊授予封闭类的类或函数;应遵守通常的访问规则(第11条)。**封闭类的成员对嵌套类的成员没有特殊的访问权限;应遵守通常的访问规则(第11条)

(My强调)
所以看起来不,内部类没有特殊的访问特权。

ftf50wuq

ftf50wuq5#

我不知道确切的位置,但我确实记得阅读了规范,发现类中的任何私有数据对所有其他类都是隐藏的,包括嵌套类。
基本上,嵌套一个类定义了一个特定的范围,而不是访问特权。

相关问题