Рассмотрим:
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
, поэтому это предложение может быть бесполезным.]