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運營商=
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運營商=
首先,如果你需要一個獨特的陣列,使其
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);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
原因是'operator ='不接受'int *'*和* * int *構造函數被標記爲'explicit'(對於'std :: unique_ptr '和'std :: unique_ptr ')。 'operator ='是一個移動賦值操作符,而不是一個拷貝賦值操作符與它無關。 –
2012-02-22 14:31:29
@LucDanton:對。已更新以包含該內容。 – kennytm 2012-02-22 20:05:05