簡體   English   中英

在 C++ 中傳遞具有移動語義的 unique_ptr 向量

[英]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.

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