Является ли многоэлементная вставка std :: list строго исключительной?

В пункте 17 exceptional c++Я нахожу это:

Во-первых, для всех контейнеров многоэлементные вставки (вставки «диапазона итераторов») никогда не являются строго безопасными для исключений.

но в пункте 1 effective STLЯ нахожу это:

Если вам нужна транзакционная семантика для многоэлементных вставок
(например, форма диапазона — см. пункт 5), вы хотите выбрать список,
потому что список является единственным стандартным контейнером, который предлагает транзакционные
семантика для многоэлементных вставок.

и на странице 249 из the c++ standard library 2thЯ нахожу это:

Для списков даже операции вставки из нескольких элементов безопасны для транзакций.

Итак, мой вопрос, какой из них прав? Сильно ли исключительная безопасность означает то же самое с безопасностью транзакции?

4

Решение

  1. какой из них прав?

Для всех перегрузок std::list::insert, строго исключительная безопасность гарантирована.

Исключения

Если выбрасывается исключение, эффекты отсутствуют (гарантия сильного исключения).

и из стандарта, $23.3.5.4/2 list modifiers [list.modifiers]:

Если выброшено исключение, никаких эффектов нет.

затем

  1. сильно исключительно-безопасно означает то же самое с безопасностью транзакций?

Да. ВотОбъяснение Херба Саттера:

Сильная гарантия: если выдается исключение, состояние программы остается неизменным. Этот уровень всегда подразумевает глобальную семантику фиксации или отката, включая то, что никакие ссылки или итераторы в контейнер не будут признаны недействительными в случае сбоя операции.

3

Другие решения

Уже ответили, что std::list предоставляет эти гарантии в соответствии со стандартом. Я хотел бы упомянуть Зачем это можно сделать в списке.

Вы можете предоставить эту гарантию, потому что список имеет операцию слияния постоянной сложности, которая является операцией без выбрасывания. Все, что вам нужно сделать, это сначала создать временный список, заполнить временный список значениями, а затем объединить временный список с исходным списком.

Если во время заполнения временного списка происходит исключение, ничего не объединяется, и временный список просто удаляется при выходе из вставки.

Поскольку ни один другой контейнер не обеспечивает постоянную сложность без единого броска, это невозможно с любым другим контейнером.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector