Вам потрібно повідомити 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 semantics and Exceptions
Похвала Бо, який натякнув, що, можливо, це пов’язано з винятками. Також враховуйте поради Kerrek SB і використовуйте їх, emplace_back
коли це можливо. Це може бути швидше (але часто ні), може бути чіткішим і компактнішим, але є й деякі підводні камені (особливо з не явними конструкторами).
Редагуйте , часто за замовчуванням ви хочете: перемістіть все, що можна перемістити, решту скопіюйте. Щоб прямо просити про це, пишіть
A(A && rhs) = default;
Роблячи це, ви отримаєте за винятком випадків, коли це можливо: чи визначено конструктор Move за замовчуванням як noexcept?
Зверніть увагу, що ранні версії Visual Studio 2015 та старіші не підтримували цього, хоча він підтримує семантику переміщення.