std::unique_ptr<int> ptr;
ptr = new int[3]; // error
错误 C2679:二进制"=":找不到采用类型为"int *"的右侧操作数的运算符(或者没有可接受的转换(
为什么不编译?如何将本机指针附加到现有unique_ptr实例?
首先,如果你需要一个唯一的数组,让它
std::unique_ptr<int[]> ptr;
// ^^^^^
这允许智能指针正确使用 delete[]
来释放指针,并定义operator[]
以模拟普通数组。
然后,仅针对唯一指针的右值引用而不是原始指针定义operator=
,并且原始指针不能隐式转换为智能指针,以避免意外分配破坏唯一性。因此,不能直接为其分配原始指针。正确的方法是将其交给构造函数:
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
函数而不是使用new
:
ptr = std::make_unique<int[]>(3);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
添加到答案来自肯尼TM
(自C++11起(
tr = (decltype(tr)(new int[3]));
我个人更喜欢这个,因为它使更新 tr 的类型更容易。(只有一个地方可以更新(