Разрешено ли генерировать std::vector::push_back по любой причине, кроме неудачного перераспределения или конструкции?

Рассматривать:

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,

В стандартах C++03 и C++0x /FCD описания vector::insert скажем, что если перераспределения не происходит, итераторы / ссылки до точки вставки остаются действительными. Они не говорят, что, если перераспределение не происходит, не генерируется исключение (кроме как из конструкторов и т. Д. T).

Есть ли что-нибудь еще в стандарте, чтобы гарантировать это?

Я не ожидаю push_back делать все, что мог бросить в этом случае. Реализация GNU этого не делает. Вопрос в том, запрещает ли это стандарт.

В качестве продолжения, может ли кто-нибудь придумать причину, по которой любая реализация будет выброшена? Лучшее, о чем я могу думать, это то, что если reserve в конечном итоге увеличивает емкость до значения, превышающего max_size(), затем insert возможно разрешено бросать length_error когда максимальный размер будет превышен. Было бы бесполезно увеличивать емкость за пределы max_size(), но я не вижу ничего, что запрещало бы это, либо [Редактировать: ваш распределитель, вероятно, остановит вас при увеличении емкости max_sizeтак что это предложение может быть бесполезным.]

1 ответ

Ну, это зависит от того, какой распределитель вы используете.

Кроме распределителя, единственное, на что вы можете положиться, это push_back() а также push_front() гарантированно будет noop, если выдается исключение (23.1-10). Стандарт определенно не запрещает push_back() от бросания исключений.

Другие вопросы по тегам