Movatterモバイル変換


[0]ホーム

URL:


This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 119a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2025-12-20


45. Access to nested classes

Section:11.8.8  [class.access.nest]    Status:CD1    Submitter:Daveed Vandevoorde    Date:29 Sep 1998

[Moved to DR at 4/01 meeting.]

Example:

    #include <iostream.h>    class C {  // entire body is private        struct Parent {            Parent() { cout << "C::Parent::Parent()\n"; }        };        struct Derived : Parent {            Derived() { cout << "C::Derived::Derived()\n"; }        };        Derived d;    };    int main() {        C c;      //  Prints message from both nested classes        return 0;    }
How legal/illegal is this? Paragraphs that seem to apply here are:

11.8 [class.access] paragraph 1:

A member of a class can be
and11.8.8 [class.access.nest]paragraph 1:
The members of a nested classhave no special access to members of an enclosing class, nor to classesor functions that have granted friendship to an enclosing class; the usualaccess rules (11.8 [class.access])shall be obeyed. [...]
This makes me think that the ': Parent' part is OK by itself,but that the implicit call of 'Parent::Parent()' by 'Derived::Derived()'is not.

From Mike Miller:

I think it is completely legal, by the reasoning given in the (non-normative)11.8.8 [class.access.nest]paragraph 2. The use of a private nested class as a base of another nested classis explicitly declared to be acceptable there. I think the rationale inthe comments in the example ("// OK because of injection of name A in A")presupposes that public members of the base class will be public membersin a (publicly-derived) derived class, regardless of the access of thebase class, so the constructor invocation should be okay as well.

I can't find anything normative that explicitly says that,though.

(See also papers J16/99-0009 = WG21 N1186,J16/00-0031 = WG21 N1254, and J16/00-0045 = WG21 N1268.)

Proposed Resolution (04/01):

  1. Insert the following as a new paragraph following11.8 [class.access] paragraph 1:

    A member of a class can also access all names as the class of whichit is a member. A local class of a member function may access thesame names that the member function itself may access. [Footnote:Access permissions are thus transitive and cumulative to nested andlocal classes.]
  2. Delete 11.8 [class.access] paragraph 6.

  3. In 11.8.8 [class.access.nest] paragraph 1, change

    The members of a nested class have no special access to members of anenclosing class, nor to classes or functions that have grantedfriendship to an enclosing class; the usual access rules(11.8 [class.access]) shall be obeyed.

    to

    A nested class is a member and as such has the same access rightsas any other member.

    Change

        B b;       // error: E::B is private

    to

        B b;       // Okay, E::I can access E::B

    Change

        p->x = i;      // error: E::x is private

    to

        p->x = i;      // Okay, E::I can access E::x
  4. Delete 11.8.8 [class.access.nest] paragraph 2.

(This resolution also resolves issues8 and10.




[8]ページ先頭

©2009-2026 Movatter.jp