定义移动赋值运算符时,如何将包含 unique_ptr 的对象分配给其类型的向量?
How do I assign an object containing an unique_ptr to a vector of its type when a move assignment operator is defined?
下面的自包含程序部分在 Visual Studio 2019 上导致此错误:
“函数“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);
下面的自包含程序部分在 Visual Studio 2019 上导致此错误:
“函数“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);