2011-07-24 25 views
8

Powiel możliwe:
Can I list-initialize a vector of move-only type?Jak zainicjować kontener nieodkopywalny z listą inicjalizatora?

Używam gcc 4.6.1 skompilować ten kod

int main() 
{ 
    std::vector<std::unique_ptr<int>> vec({ 
      std::unique_ptr<int>(new int(0)), 
      std::unique_ptr<int>(new int(1)), 
     }); 
    return 0; 
} 

W jakim g ++ narzeka istnieje coś takiego jak

/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/../../../../include/c++/4.6.1/bits/stl_construct.h:76:7: **error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&)** [with _Tp = int, _Dp = std::default_delete<int>, std::unique_ptr<_Tp, _Dp> = std::unique_ptr<int>]' 

Wygląda na to, że g ++ nadal próbuje skopiować konstruktora w tym przypadku, chociaż to co umieściłem na liście inicjalizatora są wartościami r. Więc jak mogę zainicjować kontener nieoprawiony z listą inicjalizatora?

+0

Interesujące. Z tego, co testowałem, nie wydaje się, żeby to zrobić ... – Klaim

Odpowiedz

5

Nie można przenosić obiektów z list inicjalizujących, ponieważ zezwalają one tylko na stały dostęp do ich członków. W związku z tym nie można używać list inicjalizujących i przenosić konstruktorów; mogą być kopiowane tylko.

+2

Jako następna najlepsza rzecz, można użyć 'reserve (2)', po której następuje dwa wywołanie 'emplace', które nawet nie wywoła żadnych konstruktorów ruchu. –

+0

Hmm, to powinien być błąd w C++ 0x. W tej sytuacji członkowie listy inicjalizacyjnej powinni mieć dostęp do wartości r. – neuront