2015-07-14 2 views
2

Итак, у меня есть ситуация, когда мне нужно сохранить вектор абстрактного типа, так как я понимаю, это требует использования вектора unique_ptrs или аналогичного.Перемещение вектора unique_ptr <T>

Поэтому, чтобы перемещаться по экземплярам класса, содержащего вектор unique_ptrs, мне нужно определить конструктор перемещения, который я сделал.

Однако, как показано на примере ниже, это, похоже, не согласуется с компилятором (msvc), который дает мне следующую ошибку.

Ошибка 1 Ошибка C2280: 'станд :: unique_ptr> :: unique_ptr (Const станд :: unique_ptr < _Ty, станд :: default_delete < _Ty >> &)': попытка сослаться проколотой функцию

class SomeThing{ 

}; 

class Foo{ 
public: 
    Foo(){ 

    } 
    Foo(const Foo&& other) : 
     m_bar(std::move(other.m_bar)) 
    {}; 

    std::vector<std::unique_ptr<SomeThing>> m_bar; 
}; 

int main(int argc, char* argv[]) 
{ 
    Foo f; 
    return 0; 
} 
+2

почему Const? – paulm

+0

Избавиться от 'const'. – Mysticial

+0

какая версия визуального C++? потому что это не поддерживается до VS2013 – Mgetz

ответ

7

Вы не можете перемещаться из объекта const, потому что это перемещение связано с мутацией источника.

Следовательно, вместо этого выполняется копия. И, как вы знаете, здесь невозможно.

Ваш ход конструктор должен выглядеть так, без const:

Foo(Foo&& other) 
    : m_bar(std::move(other.m_bar)) 
{} 
Смежные вопросы