問題構造函數接受一個unique_ptr的參數。
A(unique_ptr<Type> b);
如果是定義一個unique_ptr然后直接傳入,會報錯。像這樣。
unique_ptr<Type> unique_b = new Type();
A a(b);
因為這回隱式調用unique_ptr的復制構造函數,但unique_ptr已經禁止了復制構造函數。以下是怎么把unique_ptr作為參數傳入。
https://stackoverflow.com/questions/8114276/how-do-i-pass-a-unique-ptr-argument-to-a-constructor-or-a-function
(A)就解釋了如何通過value傳入。
做std::move。move(b)會產生一個unique_ptr<Type>&&的類型。這個稱為rvalue reference(右值引用)。關于右值引用,又是一個很長的故事。參考http://thbecker.net/articles/rvalue_references/section_01.html
在接到unique_ptr<Type>&&之后,編譯器又會隱式地把它變成一個右值。看起來有點多此一舉,不過這保證了move被調用,保證unique_ptr被正確得使用。直接使用unique_ptr的構造函數,因為函數回傳的是一個右值。