c++ - 是否有必要为没有动态资源的类实现移动构造函数?
问题描述
我有一个容器类,如下所示。如您所见,该类使用的所有资源都是静态分配的。类中没有动态分配的资源。这样的类是否需要移动构造函数或移动赋值运算符?
template<class T, std::size_t SIZE>
class Stack{
static_assert(SIZE != 0, "Stack capacity cannot be zero!");
public:
/*** Constructors and Destructor ***/
Stack() = default; // Default constructor
Stack(const Stack& copyStack); // Copy constructor
~Stack(); // Destructor
/*** Member Methods ***/
/* .... */
void swap(Stack& swapStack);
private:
/*** Members ***/
std::size_t idxTop{0}; // Index after the top element
T data[SIZE]; // Contained data
};
对于那些想通过实际实现进行尝试的人:
解决方案
事情就是这样。您的类不可移动,因为它没有动态分配的资源。但它包含的资源可能。例如, A在某些实例中T
可能是 a 。std::vector
那肯定可以移动,因此您必须确保通过提供复制构造函数(= default;
顺便说一句,您忘记了),编译器不会意外禁用默认的移动构造函数。
现在,您应该注意您的情况下的默认移动构造函数。问题是您有一个数组作为成员,而默认的移动构造函数只是将数组的元素一一移动。
除了其中一个的移动构造函数抛出时会发生什么?您最终移动了一半的元素,并且由于引发了异常,有些元素仍在旧数组中。那不好。看看std::move_if_noexcept
并尝试实现移动构造函数来解决这个问题。
推荐阅读
- apache-kafka - 为什么 Apache Kafka 消费者会使用不同版本的模式来反序列化记录,而不是与数据一起发送的记录?
- javascript - delphi-javascript 库 (js15/spidermonkey) 可以轻松更新到 mozilla 的最新 javascript 引擎版本吗?
- spring-boot - Kafka 未启动时 Spring Boot 应用程序未启动
- firebase - Firebase 函数部署失败
- tensorflow - tensorflow中无法获取数据集的shape属性值?
- c# - C# Split - 在列表上拆分不返回所有想要的字符串
- python - Flask Session 在 POST 请求之间不保留值
- php - 网络中的其他计算机无法访问Xampp网站
- python - 如何在 SWIG for Python 中创建时初始化 C 结构成员?
- javascript - React 状态在使用 useState 设置之前会被保存吗?