当基类提供move语义时,派生类是否需要实现它

Do derived classes need to implement move semantics when a base provides it?

本文关键字:是否 实现 派生 基类 move 语义      更新时间:2023-10-16

我读完了Thomas Becker的《c++右值参考》。我有几个关于右值和右值引用的问题。

假设我有一个简单的数组类:
template <class T>
MyArray
{
    ...
    T* m_ptr;  // Pointer to elements
    size_t m_count; // Count of elements
};

进一步假设它提供:

#if(__cplusplus >= 201103L)
MyArray(MyArray&& t)
  : m_ptr(std::move(t.m_ptr)), m_count(std::move(t.m_count))
{
    t.m_ptr = NULL;
    t.m_count = 0;
}
MyArray operator=(MyArray&& t)
{
    std::swap(*this, t);
    return *this;
}
#endif
现在,假设我有一个派生类,添加新的数据成员:
MyImprovedArray : public MyArray
{
    ...
};

MyImprovedArray需要什么?

还需要MyImprovedArray(MyImprovedArray&&)MyImprovedArray& operator=(MyImprovedArray&&)吗?如果是这样,是否只需要执行基类std::move ?或者它也需要执行std::swap ?

MyImprovedArray(MyImprovedArray&& t)
    : MyArray(t)
{
}

5(或0)规则适用于派生类,无论基类定义了什么。

如果您的派生MyImprovedArray的move构造函数不打算做任何特别的事情,不要定义它,让编译器生成一个