gpt4 book ai didi

c++ - std::is_move_assignable_v false 虽然有一个移动赋值运算符

转载 作者:行者123 更新时间:2023-12-03 07:03:24 25 4
gpt4 key购买 nike

上下文:我有课DLXMatrix具有一些属性,这些属性是一些名为 Header 的本地类的 vector .每个Header持有一些其他的指针Header它指的是同一 vector 的元素(想想一个既是 vector 又是双向链表的结构)。因此,我不能使用默认的复制构造函数和赋值运算符,因为它们会指向原始元素而不是拷贝。注意:我确保 vector 永远不会在内存中调整大小或移动。

#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不动可分配?

  • 如果重要的话,我将使用 g++ 7.5.0 和 clang++ 6.0.0 和标准 c++17 进行编译。

    最佳答案

    我按照@IlCapitano 的指示发布了一个答案。
    在执行operator=由于按值调用,我需要做一个拷贝并决定执行它。所以原型(prototype)是

    DLXMatrix &operator=(DLXMatrix other);
    而不是标准
    DLXMatrix &operator=(const DLXMatrix &other);
    编译器/库不会将这种按值调用的形式识别为正确的复制赋值运算符。

    关于c++ - std::is_move_assignable_v false 虽然有一个移动赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64608805/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com