initializer_list-移動のみの型を持つベクトルの初期化
C で、移動の要素を含むベクトルをリスト初期化しようとするとき-only 型 (std::unique_ptr など) の場合、コンパイラは、代わりに要素を誤ってコピーしようとする可能性があります。それらを移動させます。この問題は、さまざまな手法を使用して解決できます。
中間ラッパー
コピーを避けるために、ラッパー タイプを使用して移動専用の値を参照として保持できます。 rref_wrapper クラスは、移動のみの値をラップし、基になる値を抽出する演算子を提供することにより、このアプローチを示します。これにより、値をコピーせずにベクトルに移動できます。
例:
std::initializer_list<rref_wrapper<std::unique_ptr<int>>> il{ rref(std::make_unique<int>()), rref(std::make_unique<int>()), rref(std::make_unique<int>()) }; std::vector<std::unique_ptr<int>> v(il.begin(), il.end());
std::make_move_iterator
別の方法では、std::make_move_iterator を使用してイテレータを作成します。逆参照すると、ポイントされた要素が移動します。これにより、ラッパー クラスが不要になります。
例:
std::unique_ptr<int> init[] = { std::make_unique<int>(), std::make_unique<int>(), std::make_unique<int>() }; std::vector<std::unique_ptr<int>> v{ std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init)) };
これらの手法を採用することで、移動専用型のベクトルをリスト初期化することが可能になります。効率的かつ正確な所有権移転を保証します。
以上がC で移動のみの型を使用してベクトルを正しくリスト初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。