std::vector
должен либо перемещать, либо копировать свое внутреннее состояние при изменении размера после исчерпания его емкости.Однако он не знает, что безопасно переместить A
, которые он хранит (два вызова на push_back
), поскольку операции перемещения не отмечены noexcept
.Поскольку std::vector
не знает, что это безопасно, это ошибка из-за осторожности и копирования значений.
// Move constructor.
A(A&& other) noexcept : mData(NULL), mLength(0) { /* ... */ }
// Move assignment operator.
A& operator=(A&& other) noexcept { /* ... */ }
С этими изменениями я получаю следующий вывод:
A (size_t).length = 25
.
A(A&&). length = 25. Moving resource.
~A(). length = 0.
A(size_t). length = 75.
A(A&&). length = 75. Moving resource.
A(A&&). length = 25. Moving resource.
~A(). length = 0.
~A(). length = 0.
----------------------
~A(). length = 25. Deleting resource.
~A(). length = 75. Deleting resource.
Вы также можете зарезервировать достаточную емкость (v.reserve(2);
перед вызовом push_back
), но если вашему vector
когда-либо придется изменить размер, вы снова начнете копировать A
s.