Çağ*_*KME 5 c++ stack containers move
我有一个如下所示的容器类。如您所见,该类使用的所有资源都是静态分配的。类中没有动态分配的资源。这样的类是否需要移动构造函数或移动赋值运算符?
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
};
Run Code Online (Sandbox Code Playgroud)
对于那些想通过实际实现进行尝试的人:
小智 3
事情是这样的。您的类不可移动,因为它没有动态分配的资源。但它所包含的资源可能会。T例如,Astd::vector在某些实例中可能是 a 。这肯定可以移动,因此您必须确保通过提供复制构造函数(顺便说= default;一句您忘记了),编译器不会意外禁用默认移动构造函数。
现在,您应该小心您案例中的默认移动构造函数。问题是您有一个数组作为成员,而默认的移动构造函数只是将数组的元素逐一移动。
除了其中一个的移动构造函数抛出异常时会发生什么?最终,一半的元素被移动,而一些元素仍然在旧数组中,因为抛出了异常。那可不好。看一下std::move_if_noexcept,也许尝试实现移动构造函数来解决这个问题。