C++ Logo

STD-DISCUSSION

Advanced search

Subject: Zero-initialization in value-initialization of classes with defaulted default ctors
From: Anton Bikineev (ant.bikineev_at_[hidden])
Date: 2020-01-31 09:07:17


The Standard says:

To *value-initialize*
> <http://eel.is/c++draft/dcl.init#def:value-initialization> an object of
> type T means:
>
> - - if T is a (possibly cv-qualified) class type with either no
> default constructor or a default constructor that is user-provided or
> deleted, then the object is default-initialized;
>
>
> - - if T is a (possibly cv-qualified) class type without a
> user-provided or deleted default constructor, **then the object is
> zero-initialized** and the semantic constraints for
> default-initialization are checked, and if T has a non-trivial default
> constructor, the object is default-initialized;
>
>
> - - ...
>
>
I'm wondering, why in C++11 an object needs to be zero-initialized (this
was not the case before C++11)? I can't find a proposal/DR that changes
that, but I suspect that this is to align with value-initialization of
scalar types (which implies zero-initializaiton).

The problem is that this leads to suboptimal code generation:
https://godbolt.org/z/pwYjLP (this is a minimized example from optional
implementation in abseil).

In case of empty structs, I don't think that zero-initialization (and
value-initialization conceptually) is meaningful, since empty structs don't
have/store any value.

-- 
Sincerely,
Anton.


STD-DISCUSSION list run by std-discussion-owner@lists.isocpp.org

Older Archives on Google Groups