簡體   English   中英

傳遞unique_ptr右值引用結果編譯錯誤

[英]Passing unique_ptr rvalue reference result compile error

以下是示例代碼:

using namespace std;
struct A {
    A(unique_ptr<int> s)
    : _s(move(s)){}

    unique_ptr<int> _s;
};

int main(int argc, const char * argv[]) {

    auto&& ptr = make_unique<int>(5);
    A a{ptr}; // Error
    A b{move(ptr)}; // OK 
    return 0;
}

我的第一個猜測是它應該在不使用'move'的情況下工作,但我在clang上得到'調用隱式刪除的復制構造函數'。 也許'ptr'的類型不是rvalue(奇怪的是?)? 有人可以澄清一下嗎?

這里有幾件事情,其中​​大部分涉及價值類別分類中各部分的標准的措辭。 但這是它的要點:

ptr類型的扣除將遵循轉發引用的規則。 所以是的,它將是unique_ptr<int>&& 但是ptr不是左值。 這是理解的棘手問題。 它是一個你已經綁定到rvalue的引用,當然,但是現在該對象不再是未命名的,也不是對它的引用。

它現在是一個帶名字的對象。 直覺上,因為你可以分配它,它是一個左值(在一般意義上)。 因此,它不會自己綁定到右值引用。 所以你最終試圖調用復制構造函數。

要移動它,您需要再次將其轉換為過期值(從類型系統的角度來看)。 這就是std::move通過返回一個(未命名的)右值引用來做的事情。

傳遞一個r值:

A a{ make_unique<int>(5) };

或std ::移動l值

auto ptr = make_unique<int>(5);
A b{ move(ptr) };

暫無
暫無

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

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