【问题标题】:unique_ptr operator=unique_ptr 运算符=
【发布时间】:2012-02-22 11:25:16
【问题描述】:
std::unique_ptr<int> ptr;
ptr = new int[3];                // error
错误 C2679:二进制“=”:未找到采用“int *”类型的右侧操作数的运算符(或没有可接受的转换)

为什么不编译?如何将本机指针附加到现有的 unique_ptr 实例?

【问题讨论】:

    标签: c++ visual-studio-2010 c++11 smart-pointers


    【解决方案1】:

    首先,如果您需要一个唯一的数组,请制作它

    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 function 而不是使用 new

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

    【讨论】:

    • 原因是operator= 不接受int* 并且 采用int* 的构造函数被标记为explicit(对于std::unique_ptr&lt;int&gt; 和@987654338 @)。 operator= 是一个移动赋值操作符而不是一个复制赋值操作符与它无关。
    • @LucDanton:对。已更新以包含该内容。
    【解决方案2】:

    添加到答案 KennyTM

    (C++11 起)

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

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

    【讨论】:

    • 这不会调用delete 而不是delete[] 从而产生未定义的行为吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多