Рассмотрим:
std::vector<int> v;
v.reserve(1);
v.push_back(1); // is this statement guaranteed not to throw?
Я выбрал int
, потому что у него нет конструкторов, которые могли бы бросать - очевидно, если какой-то конструктор копирования T бросает, то это исключение выходит vector<T>::push_back
.
Этот вопрос применим как можно больше к insert
как push_back
, но он был вдохновлен Безопасно ли push_back 'динамически распределенный объект' на вектор?, который возникает, чтобы спросить о push_back
.
В стандарте С++ 03 и С++ 0x/FCD описания vector::insert
говорят, что если перераспределение не происходит, итераторы/ссылки до точки вставки остаются в силе. Они не говорят, что если перераспределение не происходит, исключение не генерируется (если только от конструкторов и т.д. От T).
Есть ли что-нибудь в другом месте стандарта, чтобы гарантировать это?
Я не ожидаю, что push_back
сделает все, что может в этом случае сделать. Реализации GNU нет. Вопрос в том, запрещает ли это стандарт.
Как продолжение, может ли кто-нибудь подумать о причине, почему любая реализация будет бросать? Самое лучшее, о чем я могу думать, это то, что если вызов reserve
заканчивается увеличением емкости до значения, превышающего max_size()
, тогда insert
, возможно, разрешено бросать length_error
, когда максимальный размер будет превышен, Было бы бесполезно увеличивать пропускную способность за пределами max_size()
, но я не вижу сразу ничего, что запрещало бы это [Edit: ваш распределитель, вероятно, остановит вас на увеличении пропускной способности за пределами max_size
, поэтому это предложение может быть неудобно.]