2014-11-13 12 views
7

Mam klasę, która nie może być kopiowana (tj. Konstruktor kopii & operator przypisania jest oznaczony jako "usuń"). Chciałbym zachować je w std :: vector.Niekopiowalne elementy w wektorze

Jest to klasa RAII, więc po prostu przechowywanie wskaźnika lub odniesienie do niego nie jest tym, czego szukam.

Moja wiedza na temat nowych inicjatorów wymienia & konstruktorów ruchu jest nieco ograniczona, czy to możliwe?

+6

Czy klasa jest ruchoma? – Jarod42

+0

Tak, to jest ruchome – Lieuwe

+0

Zobacz http://stackoverflow.com/questions/13577881/has-c11-changed-requirements-for-elements-of-stl-containers-and-how – rockoder

Odpowiedz

9

Tak można mieć std::vector<NotCopyable> jeśli NotCopyable jest ruchoma:

struct NotCopyable 
{ 
    NotCopyable() = default; 
    NotCopyable(const NotCopyable&) = delete; 
    NotCopyable& operator = (const NotCopyable&) = delete; 

    NotCopyable(NotCopyable&&) = default; 
    NotCopyable& operator = (NotCopyable&&) = default; 
}; 

int main() 
{ 
    std::vector<NotCopyable> v; 
    NotCopyable nc; 

    v.push_back(NotCopyable{}); 
    v.emplace_back(); 
    v.push_back(std::move(nc)); 
} 

Live example.

+0

Jeśli chcesz, aby 'push_back' działał poprawnie (oferuj silną wyjątkową gwarancję), musisz zadeklarować funkcje move (+ move-Assignment) jako' noexcept'. –

+0

@MarkusMayer Niezupełnie. Jeśli nie zostaną zadeklarowane 'noexcept', a klasa jest również kopiowalna,' push_back' skopiuje, aby zapewnić silną wyjątkową gwarancję bezpieczeństwa. Ale jeśli nie można go kopiować, to tak długo, jak funkcje ruchu nie rzucają, jesteś bezpieczny. –

2

Dopóki elementy są ruchome, tak, po prostu zapisz je w wektorze.

+0

Czy 'push_back()' faktycznie działa na takim niekopiowalnym, ale ruchomym obiekcie bez jawnego 'std :: move'? – JBL

+0

Jak? Jeśli zrobię coś takiego jak vec.push_back (myClass()) lub vec.push_back (std :: move (my_class())) to nadal narzeka, że ​​konstruktor kopiowania i operator przypisania są usuwane. – Lieuwe

+3

@Lieuwe: Nie powinno. Co to jest"? Jaki kompilator? –

Powiązane problemy