Является ли следующий способ правильного перемещения вектора дважды?
Программа реализует слой, следующий слой которого по умолчанию - Null_layer
.
При повторном связывании будет возвращен новый объект Layer с привязкой к новому Next_layer
.
Почему-то Clion говорит, что std::move(vec_)
в методе rebind
содержит ошибку: «Несоответствие типов параметров: выражение должно быть rvalue»
Но программа может скомпилироваться и "кажется" работает нормально.
Вариант использования:
rebind предназначен для связывания существующего слоя в качестве следующего слоя этого слоя. Это для построения кучи слоев снизу вверх. Когда следующий слой добавляется в стопку, следующий слой существует, и я использую перепривязку для этого слоя
Спасибо.
Тест:
#include <utility>
#include <vector>
#include <iostream>
struct Null_layer { int x; };
template<typename T, typename Next_layer=Null_layer>
class Layer {
public:
explicit Layer(std::vector<T>&& v,
Next_layer nx = Next_layer())
: vec_(std::move(v)), nx_(nx) {}
// Create new object whose next layer is an existing
// layer nx. But the new object would steal other
// data (e.g. vec_) of this object.
template<typename Nx2>
auto rebind(Nx2& nx) {
return Layer<T, Nx2&>(std::move(vec_), nx);
};
Next_layer nx_;
std::vector<T> vec_;
};
int main() {
Layer<int, Null_layer> a(std::vector<int>(10));
Null_layer n;
a.vec_[0] = 100;
auto b = a.rebind(n);
std::cout << b.vec_[0] << "\n";
}