Czy norma precyzyjnie określa, co mogę zrobić z przedmiotem po jego przeniesieniu? Kiedyś myślałem, że wszystko, co można zrobić z przeniesionym obiektem, to go zniszczyć, ale to nie wystarczy.
Na przykład weź szablon funkcji swap
zdefiniowany w bibliotece standardowej:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Oczywiście musi istnieć możliwość przypisania do obiektów przeniesionych, w przeciwnym razie linie 2 i 3 nie powiodą się. Więc co jeszcze mogę zrobić z obiektami przeniesionymi? Gdzie dokładnie mogę znaleźć te szczegóły w standardzie?
(Nawiasem mówiąc, dlaczego T c = std::move(a);
zamiast T c(std::move(a));
w wierszu 1?)
źródło
pop_back
przenieść się zvector
. Ale z pewnością możesz się dowiedzieć, czy tak jestempty()
.pop_back
from a emptyvector
ma i tak niezdefiniowane zachowanie, z pamięci, więc jestem prawie pewien, żepop_back
z przeniesionego wektora wykazującego niezdefiniowane zachowanie jest spójne.pop_back
nadal zachowuje się jak na każdym prawidłowym wektorze (może to być nawet pusty wektor).17.6.5.15 [lib.types.movedfrom]
Gdy obiekt jest w nieokreślonym stanie, możesz wykonać na nim dowolną operację, która nie ma warunków wstępnych. Jeśli istnieje operacja z warunkami wstępnymi, które chcesz wykonać, nie możesz wykonać tej operacji bezpośrednio, ponieważ nie wiesz, czy nieokreślony stan obiektu spełnia warunki wstępne.
Przykłady operacji, które generalnie nie mają warunków wstępnych:
get
,empty
,size
Przykłady operacji, które zazwyczaj mają warunki wstępne:
Ta odpowiedź jest teraz wyświetlana w formacie wideo tutaj: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
źródło
char* buffer;
iint length;
, to mój konstruktor / przypisanie przenoszenia musi zamienić (lub ustawić) wartość obu? Lub byłoby OK, jeśli długość była nieokreślona (co oznacza, żeempty
isize
zwracania wartości bez znaczenia)?