On May 19, 2012, at 9:34 PM, Jordan Rose wrote:
> On May 20, 2012, at 0:20, Richard Smith wrote:
>> On Sat, May 19, 2012 at 6:43 PM, Jordy Rose <[email protected]> wrote:
>>> I am not a standardista, but this doesn't seem right to me. The target 
>>> constructor finishes before the delegating constructor runs, and presumably 
>>> the target constructor has to be able to initialize the entire object by 
>>> itself. I don't see anything in the standard that says 'x' is 
>>> zero-initialized by the default constructor on its own, the default 
>>> constructor as a target, or the delegating constructor.
>>> 
>> [class.base.init]/7: The expression-list or braced-init-list in a 
>> mem-initializer is used to initialize the designated subobject (or, in the 
>> case of a delegating constructor, the complete class object) according to 
>> the initialization rules of [dcl.init] for direct-initialization.
>> [dcl.init]/10: An object whose initializer is an empty set of parentheses, 
>> i.e., (), shall be value-initialized.
>> [dcl.init]/7: To value-initialize an object of type T means: [...] if T is a 
>> (possibly cv-qualified) non-union class type without a user-provided 
>> constructor, then the object is zero-initialized [...]
> 
> But X /does/ have a user-provided constructor -- X::X(int). Or it will after 
> we finish defining it. Thus we should just call the implicit default 
> constructor, which will not initialize 'x'.

Richard has quoted an old draft (to be fair, I think it's probably the official 
standard).  The most recent language (N3376) is more clear:

        • To value-initialize an object of type T means:

                • —  if T is a (possibly cv-qualified) class type (Clause 9) 
with either no default constructor (12.1) or a default constructor that is 
user-provided or deleted, then the object is default-initialized;

                • —  if T is a (possibly cv-qualified) non-union class type 
without a user-provided or deleted default constructor, then the object is 
zero-initialized and, if T has a non-trivial default constructor, 
default-initialized;

                • —  if T is an array type, then each element is 
value-initialized;

                • —  otherwise, the object is zero-initialized. 

> That's a technicality, but one that feels like C++ to me. Otherwise you have 
> to pay for the zero-initialization whether you use it or not.

It's a delegating constructor call to an explicitly-defaulted default 
constructor.  If you don't want to pay for the zero-initialization, just omit 
the delegating initialization, and your constructor will do all the 
default-constructing that the defaulted default constructor would have.

Of course, the semantic difference between value-initialization and 
default-initialization is really subtle, but that's just C++ for you.

John.
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to