Контекст: у меня есть класс 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
нельзя назначать для перемещения?
Если это имеет значение, я компилирую с g++ 7.5.0 и clang++ 6.0.0 со стандартным c++17.
const DLXMatrix &
? Изменение решает проблему (у меня нет хорошего объяснения, почему). - person IlCapitano   schedule 30.10.2020is_move_assignable
, но, вероятно, он даже не видит вашего фактического оператора присваивания перемещения. - person AVH   schedule 30.10.2020