std::is_move_assignable_v false 虽然有移动赋值运算符
std::is_move_assignable_v false though there is a move assignment operator
上下文: 我有一个 class DLXMatrix
具有一些属性,这些属性是一些局部 class 的向量,称为 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
但它拒绝编译,因为我的 class 不可移动分配:
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);
此按值调用形式未被 compiler/library 识别为正确的复制赋值运算符。
上下文: 我有一个 class DLXMatrix
具有一些属性,这些属性是一些局部 class 的向量,称为 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
但它拒绝编译,因为我的 class 不可移动分配:
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);
此按值调用形式未被 compiler/library 识别为正确的复制赋值运算符。