派生类是否需要在基础提供时实现移动语义?

时间:2015-07-31 21:48:10

标签: c++ c++11 rvalue-reference rvalue

我读完了Thomas Becker's "C++ Rvalue References"。关于Rvalues和Rvalue参考,我有几个问题。

假设我有一个简单的数组类:

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)
{
}

1 个答案:

答案 0 :(得分:6)

Rule of five(或零)适用于派生类,无论基类定义了什么。

如果派生的{{1}}移动构造函数不会执行任何特殊操作,请不要对其进行定义,并让编译器生成一个。