[英]Passing vector of unique_ptr with move semantics in c++
我正在學習 CPP++14 移動語義。在編寫一小段代碼時,我觀察到了一些奇怪的行為。 我正在使用 r 值引用將唯一 ptr 的向量移動到函數。 在調試時,我發現更改也應用於移動的對象。 為什么即使物體被移動我也會觀察這個hcnage? 以下代碼中的移動有什么作用?
void func(std::vector<std::unique_ptr<int>> && vect) {
vect.emplace_back(std::move(std::make_unique<int>(3)));
return ;
}
int main() {
std::vector<std::unique_ptr<int>> a;
func(std::move(a));
cout<<(*(a[0]))<<endl;
return 0;
}
以下代碼中的移動有什么作用?
func(std::move(a));
不執行移動操作func(std::move(a));
事實上, std::move
只是執行轉換並產生一個右值(xvalue)表達式,它只是綁定到func
的右值引用參數vect
。 然后在func
內對vect
任何修改vect
對參數(即a
)產生影響,它們引用同一個對象。
特別是,
std::move
產生一個 xvalue 表達式來標識它的參數t
。 它完全等同於static_cast
到右值引用類型。
如果您將參數更改為按值傳遞,那么您將看到執行移動操作。 考慮到你展示的用法,只傳遞左值引用似乎不那么令人困惑(並且不需要再次在參數上使用std::move
)。
順便說一句:在vect.emplace_back(std::move(std::make_unique<int>(3)));
std::move
的使用是多余的, std::make_unique<int>(3)
是一個右值表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.