Вам нужно сообщить C ++ (в частности std::vector
), что ваш конструктор перемещения и деструктор не бросают, используя noexcept
. Затем при увеличении вектора будет вызываться конструктор перемещения.
Вот как объявить и реализовать конструктор перемещения, который соблюдается std::vector
:
A(A && rhs) noexcept {
std::cout << "i am the move constr" <<std::endl;
... some code doing the move ...
m_value=std::move(rhs.m_value) ;
}
Если конструктора нет noexcept
, std::vector
его нельзя использовать, поскольку он не может гарантировать гарантии исключения, требуемые стандартом.
Чтобы узнать больше о том, что сказано в стандарте, прочтите
Семантику и исключения C ++ Move.
Благодарим Бо, который намекнул, что это, возможно, связано с исключениями. Также примите во внимание совет Керрека С.Б. и используйте его, emplace_back
когда это возможно. Он может быть быстрее (но часто нет), он может быть более понятным и компактным, но есть и некоторые подводные камни (особенно с неявными конструкторами).
Редактировать , часто по умолчанию это то, что вы хотите: переместите все, что можно переместить, скопируйте остальное. Чтобы явно попросить об этом, напишите
A(A && rhs) = default;
При этом вы получите noexcept, когда это возможно: определен ли конструктор Move по умолчанию как noexcept?
Обратите внимание, что ранние версии Visual Studio 2015 и более ранние не поддерживали это, хотя и поддерживали семантику перемещения.