std::vector default default and move constructors

Jonathan Wakely jwakely@redhat.com
Mon Jan 29 14:26:00 GMT 2018


On 18/01/18 22:01 +0100, François Dumont wrote:
>On 16/01/2018 01:20, Jonathan Wakely wrote:
>>On 15/01/18 22:32 +0100, François Dumont wrote:
>>>On 15/01/2018 13:29, Jonathan Wakely wrote:
>>>>In fact it introduces a serious regression because of this line:
>>>>
>>>>>-      vector(vector&& __x) noexcept
>>>>>-      : _Base(std::move(__x)) { }
>>>>>+      vector(vector&&) = default;
>>>>
>>>>Consider what happens if we have an allocator that is not
>>>>nothrow-move-constructible, which can happen if the allocator has a
>>>>noexcept(false) move constructor, or more likely just has no move
>>>>constructor but has a noexcept(false) copy constructor:
>>>>
>>One of the move constructors needs to be defined with a function body,
>>not defaulted, so that it can also be declared noexcept
>
>Here is an updated patch with this change. Do you also want an 
>explicit noexcept on the vector(vector&&) default declaration ?

Yes please.

>Ok to commit this vector patch ?

Please wait for Stage 1, it's too late for changes that don't fix any
bugs and risk introducing new ones.

>I was going to propose a similar patch for vector<bool> but checking 
>Standard there is not this noexcept qualification on the move 
>constructor.

We can strengthen noexcept guarantees, but we can't weaken them, so
it's OK to add it to vector<bool> if our implementation cannot throw.



More information about the Gcc-patches mailing list