unique_ptr operator=


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 的类型更容易。(只有一个地方可以更新(

相关内容

  • 没有找到相关文章

最新更新