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

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

Linda Hamilton
Linda Hamilton原創
2025-01-01 08:55:09867瀏覽

How Can I Initialize a Vector with Move-Only Types in C  ?

可以實現僅移動類型的向量初始化嗎?

嘗試使用唯一指標(移動)初始化向量時會出現問題-僅限型別。當遇到這樣的程式碼時:

#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&amp;&amp; _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&amp;) = 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中文網其他相關文章!

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