簡體   English   中英

如何在C ++ 11中將vector與引用類型實例對象一起使用?

[英]How can I use vector with a reference type instance object in C++11?

C ++ 11中是否有可能沒有可復制對象的std :: vector(具有參考實例)?

struct CanNotCopy {
  int& intref_;
  CanNotCopy(int& i) noexcept : intref_(i) {}
  // How do I make move constructor and operator = ?
};

std::vector<CanNotCopy> hoge; // OK
hoge.resize(10); // default constructor required
int j = 123;
hoge[1] = CanNotCopy(j);  // copy constructor required

來自std::vector ,描述了T

對元素施加的要求取決於對容器執行的實際操作。 通常,要求元素類型滿足MoveConstructible和MoveAssignable的要求,但是許多成員函數提出了更嚴格的要求。

CanNotCopy不可移動或不可復制,因此不能用作T

部分解決方案是使用std::reference_wrapper<CanNotCopy>作為元素類型(可復制但不能默認構造):

...是一個類模板,它將引用包裝在可復制的,可分配的對象中。 它通常用作在標准容器(例如std :: vector或std :: pair)內存儲引用的機制,這些容器通常無法保存引用。

例如:

std::vector<std::reference_wrapper<CanNotCopy>> hoge;
int j = 19;
CanNotCopy c(j);
hoge.push_back(std::ref(c));
std::cout << hoge[0].get().intref_ << "\n";

resize()std::reference_wrapper<CanNotCopy>不可用,因為它不是默認可構造的。 然而,這種解決方案是脆弱的,因為有生命期的依賴CanNotCopy引用 int的內引用CanNotCopy例如,運行懸空引用的風險。

一種解決方案是使用std::unique_ptr<CanNotCopy>作為元素類型(可移動且默認可構造):

std::vector<std::unique_ptr<CanNotCopy>> hoge;
hoge.resize(5);
int j = 19;
hoge[1].reset(new CanNotCopy(j));
std::cout << hoge[1]->intref_ << "\n";

但是,在CanNotCopy仍然依賴於int引用的生命周期。

直截了當,允許vector<CanNotCopy>

struct CanNotCopy {
  int& intref_;
  CanNotCopy (CanNotCopy && from) : intref_(from.intref_) { }
};

當然,這將允許您將對象移入和移出向量,但不能創建副本或創建默認構造的元素。 我只知道類的語義,特別是我不知道intref_是什么意思。 您也必須在默認的ctor中對其進行初始化,因此我無法為您編寫該代碼。

可以通過使用std::optional / boost::optional包裝器來實現。 第二個要求使用就地工廠來實現所需的行為。

我有一個已經在這里得到很好回答的問題 :使用std::vector::emplace_back

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM