Anda perlu memberi tahu C ++ (secara khusus std::vector
) bahwa konstruktor dan destruktor pemindahan Anda tidak melempar, menggunakan noexcept
. Kemudian konstruktor bergerak akan dipanggil ketika vektor tumbuh.
Ini adalah cara mendeklarasikan dan mengimplementasikan konstruktor bergerak yang diikuti oleh 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) ;
}
Jika konstruktor tidak noexcept
, tidak std::vector
dapat menggunakannya, karena itu tidak dapat memastikan jaminan pengecualian yang diminta oleh standar.
Untuk mengetahui lebih lanjut tentang apa yang diucapkan dalam standar, baca
C ++ Move semantik dan Pengecualian
Penghargaan untuk Bo yang mengisyaratkan bahwa itu mungkin ada hubungannya dengan pengecualian. Pertimbangkan juga saran Kerrek SB dan gunakan emplace_back
jika memungkinkan. Ini bisa lebih cepat (tetapi seringkali tidak), bisa lebih jelas dan lebih kompak, tetapi ada juga beberapa kendala (terutama dengan konstruktor non-eksplisit).
Edit , sering kali defaultnya adalah yang Anda inginkan: pindahkan semua yang dapat dipindahkan, salin sisanya. Untuk secara eksplisit memintanya, tulis
A(A && rhs) = default;
Melakukan itu, Anda akan mendapatkan noexcept jika memungkinkan: Apakah default Move constructor didefinisikan sebagai noexcept?
Perhatikan bahwa versi awal Visual Studio 2015 dan yang lebih lama tidak mendukungnya, meskipun mendukung semantik bergerak.