定义移动赋值运算符时,如何将包含 unique_ptr 的对象分配给其类型的向量?

问题描述

下面的自包含程序部分导致 Visual Studio 2019 出现此错误:

"function "partition_data::operator=(const partition_data &)" (隐式声明)" 是一个被删除的函数。

基于对此类问题的研究,我定义了一个移动赋值运算符,因为 unique_ptr 但我仍然收到上述错误。如何解决此示例中的此错误?

#include <cstddef>
#include <memory>
#include <utility>
#include <vector>

struct partition_data
{
public:
    partition_data(std::size_t size,double initial_value)
        : data_(new double[size]),size_(size)
    {
        for (std::size_t i = 0; i < size; ++i)
            data_[i] = initial_value;
    }

    partition_data& operator=(partition_data&& other){
        data_ = (std::move(other.data_));
        size_ = other.size_;
    }

    partition_data(partition_data&& other) noexcept
        : data_(std::move(other.data_)),size_(other.size_)
    {
    }

private:
    std::unique_ptr<double[]> data_;
    std::size_t size_;
};


int main()
{

    partition_data A = partition_data(5,0.1);
    partition_data B = partition_data(5,0.2);
    std::vector<partition_data> V(2);
    V[0] = A;  //here occurs the error
    V[1] = B; //here occurs the error
}

解决方法

您必须移动对象:

V[0] = std::move(A);
V[1] = std::move(B);

甚至就地构建

std::vector<partition_data> V;
V.reserve(2);
V.emplace_back(5,0.1);
V.emplace_back(5,0.2);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...