std::vector<int> v;
v.reserve(1);
v.push_back(1); // is this statement guaranteed not to throw?
ich int
entschieden, weil es keine Konstrukteuren hat, die werfen könnte - natürlich aus, wenn einige Copykonstruktor von T, so dass Ausnahme entkommt vector<T>::push_back
.
Diese Frage gilt sowohl für insert
als push_back
, aber es wurde von Is it safe to push_back 'dynamically allocated object' to vector? inspiriert, die push_back
fragen geschieht.
In den C++ 03 und C++ 0x Standard/FCD, die Beschreibungen von vector::insert
sagen, dass Iteratoren/Referenzen vor dem Einfügepunkt gültig bleiben, wenn keine Neuzuordnung auftritt. Sie nicht sagen, dass, wenn keine Neuzuweisung passiert, keine Ausnahme ausgelöst wird (es sei denn von Konstruktoren usw. von T).
Gibt es sonst noch etwas im Standard, um dies zu garantieren?
Ich erwarte nicht push_back
alles zu tun, die in diesem Fall werfen könnte. Die GNU-Implementierung tut dies nicht. Die Frage ist, ob der Standard dies verbietet.
Als Follow-up, kann jemand einen Grund denken, warum jede Implementierung werfen würde? Das beste, was ich mir vorstellen kann, ist, dass, wenn ein Anruf bei reserve
die Kapazität auf einen Wert von über max_size()
erhöht, dann insert
vielleicht erlaubt ist, length_error
zu werfen, wenn die maximale Größe überschritten würde. Es wäre nutzlos, die Kapazität über max_size()
hinaus zu erhöhen, aber ich sehe nicht sofort etwas verbieten, entweder [Edit: Ihr Allokator würde wahrscheinlich Sie erhöhen Kapazität über max_size
, so dass dieser Vorschlag nicht gut sein.]
Ausschließen von Kopierkonstruktoren, die während push_back werfen könnten? – Flexo
@awoodland: Steve benutzt speziell 'int', um das vom Tisch zu nehmen –
@awoodland: ja, und wie John sagt, habe ich ein konkretes Beispiel gewählt, das alles aus Gründen der Einfachheit ignoriert. –