当基类提供时,派生类是不是需要实现移动语义?
Posted
技术标签:
【中文标题】当基类提供时,派生类是不是需要实现移动语义?【英文标题】:Do derived classes need to implement move semantics when a base provides it?当基类提供时,派生类是否需要实现移动语义? 【发布时间】:2015-07-31 21:48:09 【问题描述】:我读完了Thomas Becker's "C++ Rvalue References"。我有几个关于右值和右值引用的问题。
假设我有一个简单的数组类:
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)
【问题讨论】:
有疑问,您仍然可以使用MyImprovedArray(MyImprovedArray&&) = default;
只要你没有虚拟基地,默认就可以。如果你有一个虚拟基地,you may need to take a look at your copy/move assignment operators。
【参考方案1】:
Rule of five(或零)适用于派生类,无论基类定义什么。
如果您派生的MyImprovedArray
的移动构造函数不会做任何特殊的事情,请不要定义它,让编译器生成一个。
【讨论】:
所以我很清楚,这意味着我不需要在MyImprovedArray
中写任何东西?也就是说,声明和: MyArray(std::move(t))
(和空体)是假的? (很抱歉问。在 C++ 中,我曾多次被 “当你不需要它时不要为它付费” 的口头禅所困扰。它以虚拟析构函数结尾很糟糕)。
正确(显然除了构造函数)。如果您没有定义析构函数、移动构造函数、复制构造函数、移动赋值运算符或复制赋值运算符,那么编译器将为您生成它们(假设类基于其成员是可复制/可移动的)以上是关于当基类提供时,派生类是不是需要实现移动语义?的主要内容,如果未能解决你的问题,请参考以下文章
当基类实现 tableView:heightForRowAtIndexPath: 时如何使用 UITableViewAutomaticDimension: