微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std :: is_move_assignable_v为false,尽管有移动分配运算符

如何解决std :: is_move_assignable_v为false,尽管有移动分配运算符

上下文我有一个dlxMatrix,该类具有一些属性,这些属性是某个称为Header的本地类的向量。每个Header都在其他Header上保留了一些指针,这些指针指向同一向量的元素(认为结构既是向量又是双向链表)。结果,我不能使用认的复制构造函数和赋值运算符,因为它们将指向原始元素而不是副本。注意:我要确保向量不会在内存中调整大小或移动。

#include <type_traits>
#include <vector>

class dlxMatrix {
  private:
    struct Header {
        Header *left,*right;
    };
    std::vector<Header> heads;
  public:
    dlxMatrix() = delete;
    explicit dlxMatrix(size_t nb_col);
    dlxMatrix(const dlxMatrix &);
    dlxMatrix &operator=(dlxMatrix other);
    dlxMatrix(dlxMatrix &&) = default;
    dlxMatrix &operator=(dlxMatrix &&other) = default;
    ~dlxMatrix() = default;
};

static_assert(std::is_move_constructible<dlxMatrix>::value);
static_assert(std::is_move_assignable<dlxMatrix>::value);

如果我没记错的话,尽管我定义了自定义副本和赋值运算符,但是认的析构函数,移动构造函数和移动赋值副本应该可以按预期工作,而不会泄漏。 现在,我想使用std::swap,但由于我的班级不可移动而无法编译,因此它拒绝编译:

dlx_matrix.cpp:257:5: error: static_assert Failed due to requirement
      'std::is_move_assignable_v<dlx_backtrack::dlxMatrix>'
    static_assert(std::is_move_assignable_v<dlxMatrix>);

所以我的问题是:

  • 这是一种合理的做事方式吗?
  • 为什么dlxMatrix不可分配?

如果有问题,我将使用标准c ++ 17的g ++ 7.5.0和clang ++ 6.0.0进行编译。

解决方法

我正在按照@IlCapitano的指示发布答案。

operator=的实现中,我需要制作一个副本,并由于按值调用而决定执行它。所以原型是

DLXMatrix &operator=(DLXMatrix other);

代替标准

DLXMatrix &operator=(const DLXMatrix &other);

编译器/库未将此按值调用形式识别为正确的副本分配运算符。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。