[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