首頁 >後端開發 >C++ >如何在 C 中正確列表初始化具有僅移動類型的向量?

如何在 C 中正確列表初始化具有僅移動類型的向量?

Barbara Streisand
Barbara Streisand原創
2025-01-01 07:20:10654瀏覽

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_makeator迭代器,當取消引用,移動指向的元素。這消除了對包裝類別的需求。

範例:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn