Vous devez informer C ++ (spécifiquement std::vector
) que votre constructeur et destructeur de déplacement ne lance pas, en utilisant noexcept
. Ensuite, le constructeur de déplacement sera appelé lorsque le vecteur se développera.
Voici comment déclarer et implémenter un constuctor de déplacement qui est respecté par 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...
}
Si le constructeur ne l'est pas noexcept
, ne std::vector
peut pas l'utiliser, car il ne peut pas garantir les garanties d'exception exigées par le standard.
Pour en savoir plus sur ce qui est dit dans la norme, lisez la
sémantique et les exceptions C ++ Move
Merci à Bo qui a laissé entendre que cela pourrait avoir à voir avec des exceptions. Tenez également compte des conseils de Kerrek SB et utilisez-les emplace_back
si possible. Cela peut être plus rapide (mais ce n'est souvent pas le cas), cela peut être plus clair et plus compact, mais il y a aussi quelques pièges (surtout avec les constructeurs non explicites).
Modifier , souvent la valeur par défaut est ce que vous voulez: déplacez tout ce qui peut être déplacé, copiez le reste. Pour demander cela explicitement, écrivez
A(A && rhs) = default;
En faisant cela, vous obtiendrez noexcept lorsque cela est possible: le constructeur Move par défaut est-il défini comme noexcept?
Notez que les premières versions de Visual Studio 2015 et les versions antérieures ne le prenaient pas en charge, même s'il prend en charge la sémantique de déplacement.