当基类提供移动语义时,派生 类 是否需要实现移动语义?
Do derived classes need to implement move semantics when a base provides it?
我看完了Thomas Becker's "C++ Rvalue References"。我有几个关于右值和右值引用的问题。
假设我有一个简单的数组 class:
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
现在,假设我有一个派生的 class 不 添加新的数据成员:
MyImprovedArray : public MyArray
{
...
};
MyImprovedArray
需要什么?
是否还需要 MyImprovedArray(MyImprovedArray&&)
和 MyImprovedArray& operator=(MyImprovedArray&&)
?如果是这样,是否只需要执行base class std::move
?或者它是否也需要执行 std::swap
?
MyImprovedArray(MyImprovedArray&& t)
: MyArray(t)
{
}
Rule of five(或零)适用于派生的 class,无论基础 class 定义什么。
如果派生的 MyImprovedArray
的移动构造函数不会做任何特殊的事情,请不要定义它,让编译器生成一个。
我看完了Thomas Becker's "C++ Rvalue References"。我有几个关于右值和右值引用的问题。
假设我有一个简单的数组 class:
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
现在,假设我有一个派生的 class 不 添加新的数据成员:
MyImprovedArray : public MyArray
{
...
};
MyImprovedArray
需要什么?
是否还需要 MyImprovedArray(MyImprovedArray&&)
和 MyImprovedArray& operator=(MyImprovedArray&&)
?如果是这样,是否只需要执行base class std::move
?或者它是否也需要执行 std::swap
?
MyImprovedArray(MyImprovedArray&& t)
: MyArray(t)
{
}
Rule of five(或零)适用于派生的 class,无论基础 class 定义什么。
如果派生的 MyImprovedArray
的移动构造函数不会做任何特殊的事情,请不要定义它,让编译器生成一个。