移动构造函数 C++11
Move constructor C++11
我正在查看我继承的一些代码,它有一个矩阵 class,它在 C++ 中实现了二维矩阵,并具有移动构造函数和赋值运算符。
实现方式如下:
template<typename T, int rows, int cols>
class matrix_data {
...
std::unique_ptr<T[]> data_;
// Some definitions
typedef matrix_data<T, rows, cols> this_type
matrix_data(this_type && other)
{
std::swap(data_, other.data_);
}
};
现在,我不确定为什么要在此处交换数据指针。我认为应该是
data_ = std::move(other.data_);
我猜交换仍然没问题,因为 other
实例在移动后无论如何都应该处于无效状态。
我的问题是我是否可以用 data_ = std::move(other.data_);
替换语句是否有一些 unique_ptr
删除内容是进行交换而不是移动的原因,即如果我进行移动,原始数据被正确删除了吗?
回答你的问题:
是的,您可以将交换替换为
data_ = std::move(other.data_);
但正如评论所暗示的那样,只要您不实现复制构造函数、复制赋值运算符、移动赋值运算符或析构函数,无论如何都会发生这种情况。如果您实现了上述其中一项,将移动构造函数标记为 =default
也将完成这项工作。
在这种情况下确实不需要交换对象的内容,因为实际上没有什么可交换的,因为这是一个(移动)构造函数,this->data_
不指向任何先前分配的内存位置在指向它的指针被覆盖后被释放。
因此交换通常在实现移动assignment operator时完成,因为在这种情况下this->data
_通常持有一个指向某个时间需要释放的内存位置的指针。通过将此指针放入移出对象,当调用移出对象的析构函数时,它指向的内存将被释放。
我正在查看我继承的一些代码,它有一个矩阵 class,它在 C++ 中实现了二维矩阵,并具有移动构造函数和赋值运算符。
实现方式如下:
template<typename T, int rows, int cols>
class matrix_data {
...
std::unique_ptr<T[]> data_;
// Some definitions
typedef matrix_data<T, rows, cols> this_type
matrix_data(this_type && other)
{
std::swap(data_, other.data_);
}
};
现在,我不确定为什么要在此处交换数据指针。我认为应该是
data_ = std::move(other.data_);
我猜交换仍然没问题,因为 other
实例在移动后无论如何都应该处于无效状态。
我的问题是我是否可以用 data_ = std::move(other.data_);
替换语句是否有一些 unique_ptr
删除内容是进行交换而不是移动的原因,即如果我进行移动,原始数据被正确删除了吗?
回答你的问题:
是的,您可以将交换替换为
data_ = std::move(other.data_);
但正如评论所暗示的那样,只要您不实现复制构造函数、复制赋值运算符、移动赋值运算符或析构函数,无论如何都会发生这种情况。如果您实现了上述其中一项,将移动构造函数标记为 =default
也将完成这项工作。
在这种情况下确实不需要交换对象的内容,因为实际上没有什么可交换的,因为这是一个(移动)构造函数,this->data_
不指向任何先前分配的内存位置在指向它的指针被覆盖后被释放。
因此交换通常在实现移动assignment operator时完成,因为在这种情况下this->data
_通常持有一个指向某个时间需要释放的内存位置的指针。通过将此指针放入移出对象,当调用移出对象的析构函数时,它指向的内存将被释放。