danej klasy X
poniżej (funkcje specjalny członkowskim innym niż państwo, wyraźnie zdefiniowanego nie są istotne dla tego eksperymentu):Dlaczego funkcja resize() powoduje kopiowanie, a nie przenoszenie zawartości wektora po przekroczeniu pojemności?
struct X
{
X() { }
X(int) { }
X(X const&) { std::cout << "X(X const&)" << std::endl; }
X(X&&) { std::cout << "X(X&&)" << std::endl; }
};
Poniższy program tworzy wektor obiektów typu X
i zmienia rozmiar tak, że jego pojemność jest przekroczony i realokacja jest zmuszony:
#include <iostream>
#include <vector>
int main()
{
std::vector<X> v(5);
v.resize(v.capacity() + 1);
}
Ponieważ klasa X
zapewnia konstruktor poruszać, spodziewałbym poprzednią zawartość wektora być przeniósł do t on nowy magazyn po realokacji. Dość nieoczekiwanie, that does not seem to be the case, a wyjście pojawia się:
X(X const&)
X(X const&)
X(X const&)
X(X const&)
X(X const&)
Dlaczego?
Należy również pamiętać, że _Microsoft_ nie respektuje tej reguły, więc ten kod skompilowany z _Visual C++ _ (lub _clang_ na _Windows_) wywoła konstruktor ruchu i tym samym może zostawić cię z uszkodzonymi (pustymi) elementami w 'std :: vector 'w przypadku błędu zmiany rozmiaru. – Denis