Title
Zero-initialization with virtual base classes
Status
c++17
Section
9.4 [dcl.init]
Submitter
Richard Smith

Created on 2015-11-06.00:00:00 last changed 83 months ago

Messages

Date: 2016-11-15.00:00:00

Proposed resolution (November, 2016):

Change 9.4 [dcl.init] bullet 6.2 as follows:

To zero-initialize an object or reference of type T means:

  • if T is a scalar type (6.8 [basic.types]), the object is initialized to the value obtained by converting the integer literal 0 (zero) to T;103

  • if T is a (possibly cv-qualified) non-union class type, each non-static data member, each non-virtual base class subobject, and, if the object is not a base class subobject, each virtual base- class subobject is zero-initialized and padding is initialized to zero bits;

  • ...

Date: 2017-02-15.00:00:00

[Adopted at the February/March, 2017 meeting.]

Consider:

  struct V { int n; };
  struct A : virtual V {};
  struct B : A {
   B() : V{123}, A() {}
  } b;

Initialization of b first performs aggregate initialization of the V virtual base subobject. Then it performs value initialization of the A base subobject. Per 9.4.1 [dcl.init.general] bullet 9.1.2, the A base subobject is zero-initialized. Per 9.4.1 [dcl.init.general] bullet 6.2, this zero-initializes the V virtual base subobject.

Result: b.n is required to be 0, not 123.

History
Date User Action Args
2018-02-27 00:00:00adminsetmessages: + msg6162
2018-02-27 00:00:00adminsetstatus: open -> c++17
2015-11-06 00:00:00admincreate