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