tl;dr : 問題のコードは問題ありません。
上記のコードは問題ありstd::move
ません。それ自体は実際にはまったく変更されないため、コピー コンストラクターの代わりに と の移動コンストラクターが呼び出されるように右辺値参照にother
キャストするだけです。other
T
U
T(std::move(other))
が実行されると、T
の move コンストラクターが呼び出され (存在する場合)、inT
が inother
に移動さT
れthis
ます。が実行されるまで、U
インother
は放置されU(std::move(other))
ます。
これは、移動コンストラクター コードが実行されるときに、およびX
のメンバー/メンバー関数に依存できないことを意味することに注意してください。これらの部分は既に移動されているためです。T
U
other
other
補足として、次のように変更することで改善される可能性があります。
X(X&& other)
: T(std::move(static_cast<T&>(other)))
, U(std::move(static_cast<U&>(other)))
{
}
このバージョンは/X&&
からの暗黙的なアップキャストに依存していないためです。暗黙的なアップキャストに依存することは問題になる可能性があります。これは、 and/orがコンストラクターまたは何でも受け入れるテンプレート コンストラクターを持っている可能性があり、実際に呼び出したい move コンストラクターの代わりにどちらかが選択される可能性があるためです。T&&
U&&
T
U
T(X&&)
T(T&&)