CWG Issue 10 (original) (raw)

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

2025-04-13


10. Can a nested class access its own class name as a qualified name if it is a private member of the enclosing class?

Section: 11.8.8 [class.access.nest]Status: CD1Submitter: Josee LajoieDate: unknown

[Moved to DR at 4/01 meeting.]

Paragraph 1 says: "The members of a nested class have no special access to members of an enclosing class..."

This prevents a member of a nested class from being defined outside of its class definition. i.e. Should the following be well-formed?

class D {
    class E {
        static E* m;
    };
};

D::E* D::E::m = 1; // ill-formed

This is because the nested class does not have access to the member Ein D. 11.8 [class.access] paragraph 5 says that access to D::E is checked with member access to class E, but unfortunately that doesn't give access to D::E. 11.8 [class.access] paragraph 6 covers the access for D::E::m, but it doesn't affect the D::E access. Are there any implementations that are standard compliant that support this?

Here is another example:

class C {
    class B
    {
        C::B *t; //2 error, C::B is inaccessible
    };
};

This causes trouble for member functions declared outside of the class member list. For example:

class C {
    class B
    {
        B& operator= (const B&);
    };
};

C::B& C::B::operator= (const B&) { } //3

If the return type (i.e. C::B) is access checked in the scope of class B (as implied by 11.8 [class.access] paragraph 5) as a qualified name, then the return type is an error just like referring to C::B in the member list of class B above (i.e. //2) is ill-formed.

Proposed resolution (04/01):

The resolution for this issue is incorporated into the resolution for issue 45.