Вы должны сообщить 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) ; // etc...
}
Если конструктор не noexcept
, std::vector
не может его использовать, так как он не может гарантировать гарантии исключений, требуемые стандартом.
Подробнее о том, что сказано в стандарте, читайте
C ++ Переместить семантику и исключения
Благодарю Бо, который намекнул, что это может быть связано с исключениями. Также примите во внимание совет Kerrek SB и используйте emplace_back
, когда это возможно. Это может быть быстрее (но часто это не так), оно может быть яснее и компактнее, но есть и некоторые подводные камни (особенно с неявными конструкторами).
Редактировать , часто по умолчанию то, что вы хотите: переместить все, что можно переместить, скопировать остальные. Чтобы явно попросить об этом, напишите
A(A && rhs) = default;
После этого вы получите noexcept, когда это возможно: Определен ли конструктор Move по умолчанию как noexcept?
Обратите внимание, что более ранние версии Visual Studio 2015 и более ранние версии не поддерживали это, хотя и поддерживают семантику перемещения.