The writing of a technical specification is a bit like programming. [dcl.init]/6 can therefore be thought of as a kind of function: the function which performs zero-initialization on an object. This function gets called when a complete object is zero-initialized.
Here's some pseudo-code for the general structure of [dcl.init]/6:
void zero_init(T &t)
{
if(zero_init_1(t)) return; //Executes rule 6.1; returns false if rule 6.1 doesn't apply to T.
if(zero_init_2(t)) return; //Executes rule 6.2; returns false if rule 6.2 doesn't apply to T.
if(zero_init_3(t)) return; //Executes rule 6.3; returns false if rule 6.3 doesn't apply to T.
...
}
The important thing here is zero_init_2, the code that represents section 6.2:
bool zero_init_2(T &t)
if(T is class && T is !union)
{
zero_init_padding_bit(t);
for(auto &base : non_virtual_bases(t))
zero_init(base);
for(auto &member : members(t))
zero_init(member);
if(!is_base_class(t))
for(auto &base : virtual_bases(t))
zero_init(base);
return true; //I did initialization here.
}
return false; //No initialization done here.
}
You suggested:
I would replace "and, if the object is not a base class subobject, each virtual base class subobject is zero-initialized" by "and each virtual base class subobject of the most derived object is zero-initialized".
The code for this would be as follows:
bool zero_init_2(T &t)
if(T is class && T is !union)
{
zero_init_padding_bit(t);
for(auto &base : non_virtual_bases(t))
zero_init(base);
for(auto &member : members(t))
zero_init(member);
auto &u = get_most_derived_object(t)
for(auto &base : virtual_bases(u))
zero_init(base);
return true; //I did initialization here.
}
return false; //No initialization done here.
}
In your suggested version, there is no conditional. So there is no conditional in the pseudo-code either. But zero_init is a function that can invoke zero_init_2; that is, it is recursive.
This means that virtual base classes could be zero-initialized multiple times. Indeed, it would be infinitely recursive on any type with virtual base classes. get_most_derived_object will return the most derived object. The non-union virtual base class subobjects of this object include... the one we're currently initializing. So we will recursively reinitialize ourselves, never terminating.
The original wording ensures that the virtual base classes will only be zero-initialized once. Yours does not.