C ++ 'ya (özellikle std::vector
) hareket oluşturucunuzun ve yıkıcınızın atmadığını noexcept
,. Ardından, vektör büyüdüğünde hareket yapıcısı çağrılacaktır.
Aşağıdakiler tarafından saygı duyulan bir hareket oluşturucu nasıl bildirilir ve uygulanır 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) ;
}
Yapıcı değilse noexcept
, std::vector
onu kullanamaz, çünkü o zaman standart tarafından talep edilen istisna garantilerini garanti edemez.
Standartta söylenenler hakkında daha fazla bilgi için,
C ++ Taşıma semantiğini ve İstisnaları okuyun
İstisnalarla ilgisi olabileceğini ima eden Bo'ya kredi. Ayrıca Kerrek SB'nin tavsiyesini dikkate alın ve emplace_back
mümkünse kullanın . Daha hızlı olabilir (ancak genellikle değildir), daha net ve daha kompakt olabilir, ancak bazı tuzaklar da vardır (özellikle açık olmayan kurucularda).
Düzenleyin , genellikle varsayılan istediğiniz şeydir: taşınabilen her şeyi taşıyın, geri kalanını kopyalayın. Bunu açıkça istemek için yazın
A(A && rhs) = default;
Bunu yaparak, mümkün olduğunda noexcept elde edeceksiniz: Varsayılan Move yapıcısı noexcept olarak mı tanımlanmış?
Visual Studio 2015 ve daha eski sürümlerin, taşıma anlamlarını desteklese bile bunu desteklemediğini unutmayın.