移动构造函数C++;11 我看了一些我继承的代码,它有一个矩阵类,它在C++中实现了2D矩阵,并有移动构造函数和赋值操作符。

移动构造函数C++;11 我看了一些我继承的代码,它有一个矩阵类,它在C++中实现了2D矩阵,并有移动构造函数和赋值操作符。,c++,c++11,move,move-semantics,unique-ptr,C++,C++11,Move,Move Semantics,Unique Ptr,其实施方式如下: 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)

其实施方式如下:

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_);
    }
};
我猜交换仍然可以,因为在移动之后,
other
实例应该处于无效状态


我的问题是,我是否可以用
data\uu=std::move(other.data\ux)替换该语句
是否有一些独特的删除内容是进行交换而不是移动的原因,即如果我进行移动,原始数据是否会正确删除?

回答您的问题:

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

data_ = std::move(other.data_);
但正如评论所指出的,如果不实现move构造函数,只要不实现复制构造函数、复制赋值操作符、移动赋值操作符或析构函数,这种情况就会发生。如果您已经实现了上述其中一项,那么将move构造函数标记为
=default
也将完成此工作

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


因此,在实现移动分配运算符时,通常会进行交换,因为在这种情况下,
this->data
\通常会持有指向某个需要释放的内存位置的指针。通过将此指针放入moved from对象,当调用moved from对象的析构函数时,它所指向的内存将被释放。

将对象内容与已知的临时(即将过期)内容交换可确保对象的当前数据成员被清除。在这种情况下,这可能不是必需的,但这是此操作的常见模式。如果从对象中添加或删除数据成员,则可以少更改一个函数。析构函数将(可能)必须更改,但移动构造函数不会更改,这使得代码更改不太容易出错。另外,std::swap通常可以提供强大的异常保证,然后可以传播到移动构造函数。我认为“另一个”必须保持有效(但未指定)状态,否则它的破坏将被破坏。最佳解决方案,
matrix_data(this_type&&other)=默认值。使用
std::swap
没有任何意义,它会做更多的工作。如果类的
..
部分包含一些其他构造函数(这很可能),则您必须特别请求一个移动构造函数(但可以使用
=default
版本)。
data_ = std::move(other.data_);