Skip to content

[class.mem.general]/12 seems to conflict with [class.nest]/3 #4409

@cpplearner

Description

@cpplearner

[class.mem.general]/12:

The member-declarator-list can be omitted only after a class-specifier or an enum-specifier or in a friend declaration.

[class.nest]/3:

If class X is defined in a namespace scope, a nested class Y may be declared in class X and later defined in the definition of class X or be later defined in a namespace scope enclosing the definition of class X.

Consider

class E {
  class I1;                     // forward declaration of nested class
};

AFAIK, class I1; is a member-declaration with an elaborated-type-specifier and no member-declarator-list. According to [class.mem.general]/12, this is not permitted because there's no class-specifier or enum-specifier or friend. But [class.nest]/3 seems to suggest that it's valid. (How else can one declare but not define a class name in a class scope?)

I believe it's obvious that the example in question is valid, and [class.mem.general]/12 needs to account for elaborated-type-specifier. (Maybe it should use similar wording as in [dcl.pre]/5.)

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions