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

Рассмотрим:

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 Ответ

1 голос
/ 15 ноября 2010

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

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

...