unique_ptr 运算符=

发布于 2025-01-08 04:11:33 字数 290 浏览 0 评论 0原文

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 实例?

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)

Why this is not compiled? How can I attach native pointer to existing unique_ptr instance?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橪书 2025-01-15 04:11:33

首先,如果您需要一个唯一的数组,请创建它。

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);
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^

Firstly, if you need an unique array, make it

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

This allows the smart pointer to correctly use delete[] to deallocate the pointer, and defines the operator[] to mimic a normal array.


Then, the operator= is only defined for rvalue references of unique pointers and not raw pointers, and a raw pointer cannot be implicitly converted to a smart pointer, to avoid accidental assignment that breaks uniqueness. Therefore a raw pointer cannot be directly assigned to it. The correct approach is put it to the constructor:

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

or use the .reset function:

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

or explicitly convert the raw pointer to a unique pointer:

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

If you can use C++14, prefer the make_unique function over using new at all:

ptr = std::make_unique<int[]>(3);
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^
潇烟暮雨 2025-01-15 04:11:33

添加到答案中
KennyTM

(C++11 起)

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

我个人更喜欢这个,因为它使更新 tr 的类型变得更容易。 (只有一个地方需要更新)

Adding to the answer from
KennyTM

(since C++11)

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

Personally I prefer this as it makes updating the type of tr easier. (Only single place to update)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文