Você precisa informar ao C ++ (especificamente std::vector
) que o seu construtor e destruidor de movimento não atira, usando noexcept
. Então, o construtor de movimento será chamado quando o vetor crescer.
Esta é a forma de declarar e implementar um construtor de movimento que é respeitado por 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...
}
Se o construtor não for noexcept
, não std::vector
pode usá-lo, pois então não pode garantir as garantias de exceção exigidas pelo padrão.
Para mais informações sobre o que é dito no padrão, leia
C ++ Move semantics and Exceptions
Crédito para Bo, que deu a entender que pode ter a ver com exceções. Considere também o conselho de Kerrek SB e use emplace_back
quando possível. Ele pode ser mais rápido (mas muitas vezes não é), pode ser mais clara e mais compacto, mas também existem algumas armadilhas (especialmente com construtores não explícitas).
Edite , muitas vezes o padrão é o que você deseja: mova tudo o que pode ser movido, copie o resto. Para pedir isso explicitamente, escreva
A(A && rhs) = default;
Fazendo isso, você obterá noexcept quando possível: O construtor Move padrão está definido como noexcept?
Observe que as versões anteriores do Visual Studio 2015 e anteriores não davam suporte a isso, embora ofereça suporte à semântica de movimentação.