Sie müssen C ++ (speziell std::vector
) darüber informieren, dass Ihr Verschiebungskonstruktor und Destruktor nicht werfen noexcept
. Dann wird der Verschiebungskonstruktor aufgerufen, wenn der Vektor wächst.
So deklarieren und implementieren Sie einen Verschiebungskonstruktor, der beachtet wird von 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...
}
Wenn dies nicht der Fall ist noexcept
, std::vector
kann der Konstruktor ihn nicht verwenden, da er die vom Standard geforderten Ausnahmegarantien nicht gewährleisten kann.
Weitere Informationen zu den im Standard enthaltenen Informationen finden Sie unter
C ++ Move-Semantik und Ausnahmen
Dank an Bo, der angedeutet hat, dass dies möglicherweise mit Ausnahmen zu tun hat. Beachten Sie auch den Rat und die Verwendung von Kerrek SB, emplace_back
wenn dies möglich ist. Es kann schneller sein (ist es aber oft nicht), es kann klarer und kompakter sein, aber es gibt auch einige Fallstricke (insbesondere bei nicht expliziten Konstruktoren).
Bearbeiten , oft ist die Standardeinstellung das, was Sie wollen: Verschieben Sie alles, was verschoben werden kann, kopieren Sie den Rest. Um explizit danach zu fragen, schreiben Sie
A(A && rhs) = default;
Wenn Sie dies tun, erhalten Sie nach Möglichkeit noexcept: Ist der Standardkonstruktor Move als noexcept definiert?
Beachten Sie, dass frühere Versionen von Visual Studio 2015 und älter dies nicht unterstützten, obwohl es die Verschiebungssemantik unterstützt.