2012-02-22 62 views
9
std::unique_ptr<int> ptr; 
ptr = new int[3];    // error 
 
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int *' (or there is no acceptable conversion) 

爲什麼這不是編譯?我如何將本地指針附加到現有的unique_ptr實例?的unique_ptr運營商=

回答

27

首先,如果你需要一個獨特的陣列,使其

std::unique_ptr<int[]> ptr; 
//    ^^^^^ 

這使得智能指針正確使用delete[]解除分配指針,並定義operator[]模仿正常的陣列。


然後,operator=僅針對獨特指針rvalue引用,而不是原始指針定義,並且原始指針不能被隱式轉換爲智能指針,以避免打破唯一意外分配。因此原始指針不能直接分配給它。正確的做法是把它的構造器:

std::unique_ptr<int[]> ptr (new int[3]); 
//       ^^^^^^^^^^^^ 

或使用.reset功能:

ptr.reset(new int[3]); 
// ^^^^^^^  ^

或明確的原始指針轉換爲唯一指針:

ptr = std::unique_ptr<int[]>(new int[3]); 
// ^^^^^^^^^^^^^^^^^^^^^^^  ^

如果您可以使用C++ 14,更喜歡make_unique function完全可以使用new

ptr = std::make_unique<int[]>(3); 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+2

原因是'operator ='不接受'int *'*和* * int *構造函數被標記爲'explicit'(對於'std :: unique_ptr '和'std :: unique_ptr ')。 'operator ='是一個移動賦值操作符,而不是一個拷貝賦值操作符與它無關。 – 2012-02-22 14:31:29

+0

@LucDanton:對。已更新以包含該內容。 – kennytm 2012-02-22 20:05:05

2

添加到答案從 KennyTM

(因爲C++ 11)

tr = (decltype(tr)(new int[3])); 

個人我喜歡這個,因爲它使更新的TR更容易的類型。 (只有一個地方要更新)