Ответ 1
Объявление конструктора копии, заданного пользователем, не будет определять неявный конструктор перемещения; T
должен либо иметь конструктор копирования, либо конструктор перемещения для push_back
или emplace_back*
объекта в std::vector<T>
.
В документах см. Требования к T
для создания std::vector<T>
. (Здесь нет ограничений, читайте дальше).
Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых на контейнере. Как правило, требуется, чтобы тип элемента отвечал требованиям Erasable, но многие функции-члены предъявляют более строгие требования. Этот контейнер (но не его члены) может быть создан с неполным типом элемента, если распределитель удовлетворяет требованиям полноты распределителя.
Из std::vector<...>::push_back
:
Требования к типу
T
должен соответствовать требованиям CopyInsertable, чтобы использовать перегрузку (1).T
должен соответствовать требованиям MoveInsertable, чтобы использовать перегрузку (2).
Из std::vector<...>::emplace_back
:
Требования к типу
T
(тип элемента контейнера) должен соответствовать требованиям MoveInsertable и EmplaceConstructible.
Однако для emplace_back
ваш код будет удовлетворять критериям EmplaceConstructible, потому что могут произойти перераспределения, вы также должны выполнить MoveInsertable.