Разрешено ли генерировать 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()
от бросания исключений.