Если я правильно понимаю, std::vector::insert
не гарантирует фиксацию или откат для std::vector
(по очевидным причинам это делает для std::list
) в случае, если исключение выбрасывается во время копирования или перемещения из-за высокой стоимости проверки на исключения. Недавно я заметил, что push_back
гарантирует успешную установку в конце или ничего не происходит.
Мой вопрос следующий. Предположим, что при a push_pack
вектор должен быть изменен (происходит перераспределение). В этом случае все элементы должны быть скопированы в новый контейнер через семантику копирования или перемещения. Предполагая, что конструктор перемещения не гарантирован noexcept
, std::vector
будет использовать семантику копирования. Таким образом, чтобы гарантировать вышеприведенное поведение push_pack
, std::vector
должен проверить успешное копирование, а если нет, откат через своп начального вектора. Это то, что происходит, и если да, то это не так дорого? Или, поскольку перераспределение происходит редко, можно сказать, что амортизированная стоимость низкая?