ホームページ >バックエンド開発 >C++ >C で移動のみの型を使用してベクトルを正しくリスト初期化する方法

C で移動のみの型を使用してベクトルを正しくリスト初期化する方法

Barbara Streisand
Barbara Streisandオリジナル
2025-01-01 07:20:10668ブラウズ

How to Correctly List-Initialize Vectors with Move-Only Types in C  ?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。