可以實現僅移動類型的向量初始化嗎?
嘗試使用唯一指標(移動)初始化向量時會出現問題-僅限型別。當遇到這樣的程式碼時:
#include <vector> #include <memory> using move_only = std::unique_ptr<int>; std::vector<move_only> v { move_only(), move_only(), move_only() };
GCC 4.7 盡力從初始化清單中複製唯一指針,由於std::unique_ptr 的僅移動性質,導致不允許的複製嘗試.
GCC 的方法:是嗎有缺陷嗎?
考慮到唯一指標是不可複製的,GCC 複製指標的意圖是正確的。但是,它使用的方法(從初始值設定項目清單進行複製)會觸發已刪除的複製構造函數。
使用Make Move Iterator 的替代解決方案
處理僅移動類型向量初始化,首選方法涉及利用make move 迭代器:
#include <iterator> #include <vector> #include <memory> int main(){ using move_only = std::unique_ptr<int>; move_only init[] = { move_only(), move_only(), move_only() }; std::vector<move_only> v{std::make_move_iterator(std::begin(init)), std::make_move_iterator(std::end(init))}; }
從make move 得到的迭代器迭代器在解引用時促進元素的移動,解決複製問題。
使用模板包裝器的替代解決方案
另一種方法涉及使用具有右值引用語義的模板包裝器:
// Helper type for converting rvalues to lvalues template<class T> struct rref_wrapper { explicit rref_wrapper(T&& v) : _val(std::move(v)) {} explicit operator T() const{ return T{ std::move(_val) }; } private: T&& _val; }; // Helper function to convert rvalues to rref_wrappers template<class T> typename std::enable_if< !std::is_lvalue_reference<T>::value, rref_wrapper<T> >::type rref(T&& v){ return rref_wrapper<T>(std::move(v)); } // Helper function to delete lvalue references template<class T> void rref(T&) = delete;
雖然此解決方案提供了一種從概念上將右值轉換為左值,由於其波動性,謹慎行事至關重要。可以透過兩步驟過程實現更簡潔的初始化:
std::initializer_list<rref_wrapper<move_only>> il{ rref(move_only()), rref(move_only()), rref(move_only()) }; std::vector<move_only> v(il.begin(), il.end());
以上是如何在 C 中初始化具有僅移動類型的向量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!