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

jww*_*jww 6 c++ rvalue rvalue-reference c++11

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

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

template <class T>
MyArray
{
    ...
    T* m_ptr;  // Pointer to elements
    size_t m_count; // Count of elements
};
Run Code Online (Sandbox Code Playgroud)

进一步假设它提供:

#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
Run Code Online (Sandbox Code Playgroud)

现在,假设我有一个添加新数据成员的派生类:

MyImprovedArray : public MyArray
{
    ...
};
Run Code Online (Sandbox Code Playgroud)

需要什么MyImprovedArray

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

MyImprovedArray(MyImprovedArray&& t)
    : MyArray(t)
{
}
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 6

无论基类定义什么,规则五(或零)都适用于派生类.

如果派生MyImprovedArray的移动构造函数不会做任何特殊的操作,请不要定义它,并让编译器生成一个.

  • 正确(显然除了构造函数).如果你没有定义析构函数,移动构造函数,复制构造函数,移动赋值运算符或复制赋值运算符,那么编译器将为你创建它们(假设类是基于其成员的可复制/可移动的) (4认同)