![](/img/trans.png)
[英]C++11 : How can I define a function that accept a universal reference of a specific type of object?
[英]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.