[cfe-commits] r159733 - in /cfe/trunk: lib/Sema/SemaInit.cpp test/CodeGenCXX/const-init-cxx11.cpp test/CodeGenCXX/constructor-init.cpp test/SemaCXX/constant-expression-cxx11.cpp test/SemaCXX/cxx0x-initializer-constructor.cpp

James Dennett jdennett at google.com
Sun Jul 8 11:24:57 PDT 2012

On Sun, Jul 8, 2012 at 6:41 AM, Johannes Schaub
<schaub.johannes at googlemail.com> wrote:
> Am 05.07.2012 10:39, schrieb Richard Smith:
>> Author: rsmith
>> Date: Thu Jul  5 03:39:21 2012
>> New Revision: 159733
>> URL: http://llvm.org/viewvc/llvm-project?rev=159733&view=rev
>> Log:
>> PR13273: When performing list-initialization with an empty initializer list,
>> actually perform value initialization rather than trying to fake it with a call
>> to the default constructor. Fixes various bugs related to the previously-missing
>> zero-initialization in this case.
> ...
>> +namespace explicit_default {
>> +  struct A {
>> +    explicit A(); // expected-note{{here}}
>> +  };
>> +  A a {}; // ok
>> +  // This is copy-list-initialization, and we choose an explicit constructor
>> +  // (even though we do so via value-initialization), so the initialization is
>> +  // ill-formed.
>> +  A b = {}; // expected-error{{chosen constructor is explicit}}
>> +}
>> +
> Richard, I'm pretty sure that this is valid code. A value-initialization
> doesn't respect "explicit". Are you assuming a C++ Standard defect here?

The law governing this initially _seems_ to be "An explicit
constructor constructs objects just like non-explicit constructors,
but does so only where the direct-initialization syntax (8.5) or where
casts (5.2.9, 5.4) are explicitly used."

Based on that, copy-list-initialization doesn't qualify, even though
it is value-initialization in this case.  It's not
direct-initialization, and it's not a cast.

The standard (or at leas the FDIS) continues to say "A default
constructor may be an explicit constructor; such a constructor will be
used to perform default-initialization or value-initialization (8.5)"
without saying whether this overrides the previous sentence.

I believe that Richard's interpretation is consistent with both of
these: explicit default constructors can be used to perform
value-initialization, but only via the direct-initialization syntax
(specifically, "T x{a}", where "a" is empty in this case).

-- James

More information about the cfe-commits mailing list