Подтвердить что ты не робот

Является ли 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.

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

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

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

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

4b9b3361

Ответ 1

Ну, это зависит от используемого вами распределителя.

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