2016-06-07 6 views
11

Innymi słowy jest następujący kod dźwiękowy (zdefiniowane zachowanie, przenośny, ...)Czy to jest bezpieczne, aby zadzwonić vector.resize (0) po przeniesieniu jej zawartość

std::vector<int> vec(100,42); 
    std::vector<int> other = std::move(vec); 
    vec.resize(0);//is this sound 

    //using vec like an empty vector 
+2

Możesz zrobić * cokolwiek * z tym "wektorem", który nie oczekuje żadnych szczególnych właściwości (poza ważnością). Wolałbym jednak 'clear()' over 'resize (0)'. – Walter

Odpowiedz

9

Tak, to jest bezpieczne.

Od §23.3.6.5:

Jeśli sz <= size(), równoznaczne z wywołaniem pop_back()size() - sz razy. Jeśli size() < sz, dodaje sz - size() elementów wstawionych domyślnie do sekwencji.

Więc w zasadzie, kiedy zadzwonić resize(0), wywołuje pop_back() aż każdy element jest usuwany z wektorem.

Nie ma znaczenia, że ​​został przeniesiony vec, ponieważ chociaż stan vec jest nieokreślony, jest to nadal poprawny wektor, który można zmodyfikować.

Tak więc std::vector będzie puste po połączeniu z numerem resize(0).

+3

Nie, nie można wywołać 'pop_back()', ponieważ 'pop_back()' ma warunki wstępne. Jednakże 'size()' nie, i po wywołaniu 'size()' i zapewnieniu, że jest większe niż 0, sprawdziłeś, czy wektor spełnia warunki wstępne 'pop_back()', i tak to można bezpiecznie wywołać. –

+4

[FYI] To jest [defekt] (http://wg21.cmeerw.net/lwg/issue2160), aby zdefiniować 'resize' w kategoriach' pop_back'. – NathanOliver

5

Po przejściu z obiektu nie można zasadniczo przyjąć żadnych założeń dotyczących stanu obiektu. Oznacza to, że można tylko wywoływać funkcje składowe, które nie mają żadnych warunków wstępnych. Szczęśliwie, std::vector::resize nie ma warunków zależnych od wartości, więc możesz wywołać resize na przenoszonym z wektora.

+0

* zasadniczo nie można przyjąć żadnych założeń dotyczących stanu obiektu * ** źle **: można założyć, że jest poprawny. O to chodzi. – Walter

+0

Co do warunków wymienionych dla zmiany rozmiaru. §23.3.6.3: 13 * Wymagane: T będzie MoveInsertable i DefaultInsertable na * this. * –

+4

@Walter: To oczywiste. Każdy obiekt jest ważny. W przeciwnym razie nie jest to obiekt. –

Powiązane problemy