Kod wykazuje niezdefiniowanej zachowanie, ale jest to trudne i zwykle przechwytywane tylko w kompilacjach debugowania.
Po wykonaniu v.push_back
, wszystkie iteratory są unieważniane, jeśli rozmiar przekroczy pojemność. Unikniesz tego z rezerwą.
Jednak nawet jeśli nie zwiększysz pojemności, ostateczny iterator nadal będzie unieważniany. Ogólnie rzecz biorąc, reguły nieważności iteratora nie rozróżniają między "wartością iteratora" będącą śmieciem/odwołaniem do innego obiektu "i" lokalizacja iteratora "nie jest już ważna". Kiedy tak się dzieje, iterator jest po prostu uważany za nieważny. Ponieważ iterator końcowy nie jest już iteratorem końcowym (chodzi o odwoływanie się do niczego, odwoływanie się do czegoś, prawie we wszystkich implementacjach), standard po prostu stwierdza, że jest on unieważniany.
ten kod:
for (auto e: v)
v.push_back(e*e);
rozszerza się z grubsza:
{
auto && __range = v;
for (auto __begin = v.begin(),
__end = v.end();
__begin != __end;
++__begin
)
{
auto e = *__begin;
v.push_back(e*e);
}
}
wywołanie v.push_back
unieważnia __end
iterator, który jest następnie porównywana, a build debugowania poprawnie flagi na zachowanie niezdefiniowane postaci problem. Debugowanie Iteratory MSVC są dość ostrożne z zasadami unieważnienia.
Kompilacja wydania ma niezdefiniowane zachowanie, a ponieważ wektor iteratora jest w zasadzie cienkim obwolutą wokół wskaźnika, a wskaźnik do elementu przeszłego końca staje się wskaźnikiem do ostatniego elementu po wycofaniu bez zdolności przepełnienie, "działa".
To nieokreślone zachowanie, może działać, a może nie. W kompilacji debugowania nie działa. –
Jeśli chodzi o tytuł, może on dotyczyć tak szerokiego zakresu pytań. Powinieneś rozważyć wymyślenie tytułu ściśle pasującego do treści pytania. Na przykład, może coś w stylu "Czy legalne jest dodawanie elementów do predallocated vector w pętli opartej na zakresie dla tego wektora?" Zostawię to, aby wybrać to, co uważasz za rozsądne. – chris
@chris Masz rację co do tytułu i ja go zredagowałem. Powód, dla którego nie poszedłem z podobnym tytułem w pierwszej kolejności, jest czysto polityczny.Zauważyłem, że redaktorzy SO są zbyt szczęśliwi w zgłaszaniu pytań jako duplikatów i lekceważą wszelkie przyszłe argumenty przeciwne. Chciałem go obejść. –