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