如何解决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 举报,一经查实,本站将立刻删除。