Title
Direct vs indirect bases in standard-layout classes
Status
cd4
Section
Clause [11] [class]
Submitter
Daveed Vandevoorde

Created on 2013-11-20.00:00:00 last changed 49 months ago

Messages

Date: 2014-11-15.00:00:00

[Moved to DR at the November, 2014 meeting.]

Date: 2014-06-15.00:00:00

Proposed resolution (June, 2014):

Change Clause 11 [class] paragraph 7 as follows:

A standard-layout class is a class that:

  • has no non-static data members of type non-standard-layout class (or array of such types) or reference,

  • has no virtual functions (11.7.3 [class.virtual]) and no virtual base classes (11.7.2 [class.mi]),

  • has the same access control (Clause 11.8 [class.access]) for all non-static data members,

  • has no non-standard-layout base classes,

  • has at most one base class subobject of any given type,

  • either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members has all non-static data members and bit-fields in the class and its base classes first declared in the same class, and

  • has no base classes of the same type as the first non-static data member.109

[Example:

   struct B { int i; };         // standard-layout class
   struct C : B { };            // standard-layout class
   struct D : C { };            // standard-layout class
   struct E : D { char : 4; };  // not a standard-layout class

   struct Q {};
   struct S : Q { };
   struct T : Q { };
   struct U : S, T { };         // not a standard-layout class

end example]

This resolution also resolves issue 1881.

(See also the related changes in the resolution of issue 1672.)

Date: 2020-12-15.00:00:00

One of the criteria for a standard-layout class in Clause 11 [class] paragraph 7 is:

  • either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members,

In an example like

  struct B { int i; };
  struct C : B { };
  struct D : C { };

this could be read as indicating that D is not a standard-layout class, since it has two base classes, one direct and one indirect, that each have a non-static data member. The intent should be clarified.

See also issue 1881 for a related question about standard-layout classes.

History
Date User Action Args
2017-02-06 00:00:00adminsetstatus: drwp -> cd4
2015-05-25 00:00:00adminsetstatus: dr -> drwp
2015-04-13 00:00:00adminsetmessages: + msg5388
2014-11-24 00:00:00adminsetstatus: tentatively ready -> dr
2014-07-07 00:00:00adminsetmessages: + msg5078
2014-07-07 00:00:00adminsetstatus: drafting -> tentatively ready
2014-03-03 00:00:00adminsetstatus: open -> drafting
2013-11-20 00:00:00admincreate