当基类提供move语义时,派生类是否需要实现它
Do derived classes need to implement move semantics when a base provides it?
我读完了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构造函数不打算做任何特别的事情,不要定义它,让编译器生成一个
相关文章:
- 这个极客对极客的trie实现是否存在内存泄漏问题
- cmath 是否借用了 math.h 的实现
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 它是否定义了哪些算法可以接受可变 lambda 的实现?
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 共享内存的升压容器是否实现锁定?
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- C 混合蛋白,检查模板类型是否实现了某些混合蛋白
- OmNET++动态检查NED模块是否实现了接口
- 如何检查是否实现了每个声明的类函数
- MOV x86指令是否实现C++11 memory_order_release原子存储
- 如何确定类是否实现!=操作员过载
- C++ 在运行时检查对象是否实现接口
- 测试容器是否实现.at()成员访问/ std::sort兼容的正确方法
- 英特尔TBB concurrent_queue是如何工作的?它是否实现了细粒度的并行性
- 如何正确检查对象是否实现了接口
- 这两个矢量初始化是否实现相同的结果
- 我可以知道一个多态对象是否实现了一个任意的抽象类