簡體   English   中英

唯一指針:左值參考與右值參考 function 調用

[英]Unique Pointers: LValue Reference vs RValue Reference function calls

我開始使用 c++ std::unique_ptr s,我偶然發現了以下問題:

我想將我的唯一指針的引用傳遞給 function 並為此 function 中的指針分配一個新值。 直覺上,我認為 function 需要采用lvalue引用才能修改指針。 但是,在下面的代碼示例中,兩個選項( lvalue引用和rvalue引用 + std::move )做同樣的事情(我想)。

#include <memory>
#include <utility>

struct Widget {
    Widget(int) {}
};

void reseat_RValue(std::unique_ptr<Widget>&& uniqPtr) {
    auto tempUniqPtr = std::make_unique<Widget>(2003);
    uniqPtr = std::move(tempUniqPtr);
}

void reseat_LValue(std::unique_ptr<Widget>& uniqPtr) {
    auto tempUniqPtr = std::make_unique<Widget>(2010);
    uniqPtr = std::move(tempUniqPtr);
}

int main() {
    auto uniqPtr = std::make_unique<Widget>(1998);

    reseat_RValue(std::move(uniqPtr)); // (1)

    reseat_LValue(uniqPtr); // (2)   
}

我真的不明白, (1)(2)之間有什么區別,或者更確切地說,我應該將哪一個用於我的用例。 所以也許有人可以解釋每個功能發生了什么以及我應該使用哪個功能。

是的,他們做同樣的事情。 根據您的意圖,即通過引用傳遞並在 function 中對其進行修改,通過左值引用傳遞會更好。 它使您的意圖更加清晰(如@bitmask 建議的那樣); function 需要一個左值,並將在 function 內修改它。 對於按右值引用傳遞,您需要使用std::move將左值傳遞給 function,它允許像臨時變量一樣傳遞右值,這似乎毫無意義。 例如

// meaningless; the temporary `std::unique_ptr` would be destroyed immediately
reseat_RValue(std::make_unique<Widget>(1998)); 

實際上 std::unique_ptr::reset 在帶有左值引用的 function 中為您做同樣的事情 - 它更簡單。 IMO,右值語義最適合大對象,而不是指針。 但是,是的,unique_ptr 使用它來實現唯一的指針計數。

暫無
暫無

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

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