Перемещение вектора в объекте в два раза - PullRequest
0 голосов
/ 15 мая 2018

Является ли следующий способ правильного перемещения вектора дважды?

Программа реализует слой, следующий слой которого по умолчанию - 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";
}
...