std::vector
を使用して、移動コンストラクタとデストラクタがスローしないことを C++ (具体的には ) に通知する必要がありますnoexcept
。次に、ベクターが大きくなると移動コンストラクターが呼び出されます。
これは、によって尊重される移動コンストラクターを宣言および実装する方法です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...
}
コンストラクターが でない場合は、標準で要求される例外保証を保証できないため、使用できませんnoexcept
。std::vector
標準で述べられていることの詳細については、
C++ Move のセマンティクスと例外を参照してください。
例外に関係している可能性があることをほのめかした Bo の功績です。また、可能な場合は Kerrek SB のアドバイスと使用を検討してくださいemplace_back
。高速化できますが (多くの場合そうではありません)、より明確でコンパクトになりますが、いくつかの落とし穴もあります (特に非明示的なコンストラクターの場合)。
Edit、多くの場合、デフォルトはあなたが望むものです:移動できるものはすべて移動し、残りはコピーします。それを明示的に求めるには、次のように記述します。
A(A && rhs) = default;
そうすることで、可能な場合は noexcept が得られます:デフォルトの Move コンストラクターは noexcept として定義されていますか?
Visual Studio 2015 以前の初期バージョンでは、移動セマンティクスがサポートされていても、これはサポートされていないことに注意してください。