This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 115e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-11-11
[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.
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;...