移动构造函数C ++ 11

Luc*_*uca 5 c++ move unique-ptr move-semantics c++11

我正在看一些继承的代码,它有一个矩阵类,该类在C ++中实现2D矩阵,并具有移动构造函数和赋值运算符。

它的实现方式如下:

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_);
    }
};
Run Code Online (Sandbox Code Playgroud)

现在,我不确定为什么在这里交换数据指针。我认为应该是这样

data_ = std::move(other.data_);
Run Code Online (Sandbox Code Playgroud)

我猜测交换仍然other可以,因为实例在移动后无论如何都应该处于无效状态。

我的问题是我是否可以将语句替换为data_ = std::move(other.data_);是否存在一些unique_ptr删除内容,这是进行交换而不是移动的原因,即如果我进行移动,则原始数据将被正确删除吗?

Ang*_*ket 2

回答你的问题:

是的,您可以将交换替换为

data_ = std::move(other.data_);
Run Code Online (Sandbox Code Playgroud)

但正如评论所暗示的,当您不实现移动构造函数时,只要您不实现复制构造函数、复制赋值运算符、移动赋值运算符或析构函数,无论如何都会发生这种情况。如果您已经实现了上述其中一项,将移动构造函数标记为=default也可以完成这项工作。

在这种情况下,交换对象的内容确实是不必要的,因为实际上没有什么可以交换,因为这是一个(移动)构造函数,this->data_不指向任何先前分配的内存位置,在指向它的指针被覆盖后应该释放这些位置。

因此,交换通常在实现移动赋值 运算符时进行,因为在这种情况下this->data_ 通常保存一个指向有时需要释放的内存位置的指针。通过将此指针放入移出对象中,当调用移出对象的析构函数时,将释放它指向的内存。