Default std::vector<bool> default and move constructor

François Dumont frs.dumont@gmail.com
Mon May 29 20:55:00 GMT 2017


Hi

     It wasn't such a big deal to restore value-init of the allocator. 
So here is the updated patch.

     I used:
       _Bvector_impl() _GLIBCXX_NOEXCEPT_IF( noexcept(_Bit_alloc_type()) )

     rather than using is_nothrow_default_constructible. Any advantage 
in one approach or the other ?

     I'll complete testing and add a test on this value-initialization 
before commit if you agree.

     Tests still running but I'm pretty sure it will work the same.

François


On 28/05/2017 22:13, François Dumont wrote:
> On 27/05/2017 13:14, Jonathan Wakely wrote:
>> On 26/05/17 23:13 +0200, François Dumont wrote:
>>> On 25/05/2017 18:28, Jonathan Wakely wrote:
>>>> On 15/05/17 19:57 +0200, François Dumont wrote:
>>>>> Hi
>>>>>
>>>>>   Following what I have started on RbTree here is a patch to 
>>>>> default implementation of default and move constructors on 
>>>>> std::vector<bool>.
>>>>>
>>>>>   As in _Rb_tree_impl the default allocator is not value 
>>>>> initialized anymore. We could add a small helper type arround the 
>>>>> allocator to do this value initialization per default. Should I do 
>>>>> so ?
>>>>
>>>> It's required to be value-initialized, so if your patch changes that
>>>> then it's a problem.
>>>>
>>>> Did we decide it's OK to do that for RB-trees? Did we actually discuss
>>>> that part of the r243379 changes?
>>>
>>> I remember a message pointing this issue but after the commit AFAIR. 
>>> I thought it was from Tim but I can't find it on the archive.
>>>
>>> What is the rational of this requirement ? I started working on a 
>>> type to do the allocator value initialization if there is no default 
>>> constructor but it seems quite complicated to do so. It is quite sad 
>>> that we can't fully benefit from this nice C++11 feature just 
>>> because of this requirement. If there is any initialization needed 
>>> it doesn't sound complicated to provide a default constructor.
>>
>> The standard says that the default constructor is:
>>
>>  vector() : vector(Allocator()) { }
>>
>> That value-initializes the allocator. If the allocator type behaves
>> differently for value-init and default-init (e.g. it has data members
>> that are left uninitialized by default-init) then the difference
>> matters. If you change the code so it only does default-init of the
>> allocator then you will introduce an observable difference.
>>
>> I don't see any requirement that a DefaultConstructible allocator
>> cannot leave members uninitialized, so that means the standard
>> requires default construction of vector<bool> to value-init the
>> allocator. Not default-init.
>
> Sure but like freedom which stop where start others' freedom so does 
> those requirements :-). Because the Standard says that an allocator 
> will be value-init when there is no default-init it makes usage of the 
> C++11 default constructor more complicated.
>
> But as it is unavoidable here is a type I tried to work on to keep 
> current implementations as long as we inherit from 
> __alloc_value_initializer.
>
> I don't like it myself but I propose just in case you are interested.
>
> Otherwise I am also going to rework my patch to keep this initialization.
>
> François
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: bvector.patch
Type: text/x-patch
Size: 9631 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20170529/73b88e95/attachment.bin>


More information about the Libstdc++ mailing list