是否有必要为没有动态资源的类实现移动构造函数?

Ç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,也许尝试实现移动构造函数来解决这个问题。