首页 > 解决方案 > 是否有必要为没有动态资源的类实现移动构造函数?

问题描述

我有一个容器类,如下所示。如您所见,该类使用的所有资源都是静态分配的。类中没有动态分配的资源。这样的类是否需要移动构造函数或移动赋值运算符?

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
};

对于那些想通过实际实现进行尝试的人:

标签: c++stackcontainersmove

解决方案


事情就是这样。您的类不可移动,因为它没有动态分配的资源。但它包含的资源可能。例如, A在某些实例中T可能是 a 。std::vector那肯定可以移动,因此您必须确保通过提供复制构造函数(= default;顺便说一句,您忘记了),编译器不会意外禁用默认的移动构造函数。

现在,您应该注意您的情况下的默认移动构造函数。问题是您有一个数组作为成员,而默认的移动构造函数只是将数组的元素一一移动。

除了其中一个的移动构造函数抛出时会发生什么?您最终移动了一半的元素,并且由于引发了异常,有些元素仍在旧数组中。那不好。看看std::move_if_noexcept并尝试实现移动构造函数来解决这个问题。


推荐阅读