Где я могу найти все гарантии исключения для стандартных контейнеров и алгоритмов?

StackOverflow https://stackoverflow.com//questions/11699083

Вопрос

Да, я посмотрел на Стандарты C ++ что я смогу найти (или черновики), но я не нахожу всеобъемлющие гарантии исключения, данные контейнерами STL.Все, что я могу найти, являются случайными разделами с неполными описаниями на некоторые функций для некоторые типов.Или, возможно, это там, но я просто не нахожу это, я не знаю.

Примечание: я не просить список всех гарантий, которые люди могут думать, что в основном в Этот вопрос .
Я ищу авторитетный источник этой информации - или предпочтительно, бесплатная версия источника (например, проект стандарта), где я могу более или менее лечить как официальный.

.
Это было полезно?

Решение

Чтение Стандарта может быть страшно (давайте вернемся к стандарту), но Bjarne Stroustrup написал действительно хорошее приложение на эту тему в своей книге «Язык программирования C ++». Он опубликовал это приложение на

http://www.stroustrup.com/3rd_safe0.html , http://www.stroustrup.com/3rd_safe.pdf

Это довольно долго и подробно (и хорошо написано). Вы можете, например, найти раздел E.4 интересным, цитата:

E.4 Стандартные контейнерные гарантии

Если библиотечная операция сама бросает исключение, может и делает - и делает - Убедитесь, что объекты, на которых он работает, остаются в четко определенное состояние. Например, AT () выбрасывает OUT_OF_RANGE для Фото со стока (§ 16.3.3) не проблема с безопасностью исключения для вектора Отказ Писатель в () не имеет проблем, убедившись, что вектор находится в четко определенное состояние перед броском.

Кроме того, раздел E.4.1 состояния

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

Посмотрите на стр. 956. Он содержит таблицу гарантий для различных операций для вектора, DECE, списка и карты. Таким образом, все операции на этих контейнерах являются либо Nothrow, либо сильными, кроме N - элементов вставки в карту , которые предлагают основные гарантии.

Примечание. Приведенный выше текст старый и не обращается к C ++ 11, но все равно должен быть достаточно правильным для большинства целей и целей.

Когда дело доходит до C ++ 11 ...

Стандартные первые состояния, о контейнерах Генеракодицетагкод: в

23.2.1 / 10 :

Если не указано иное (см. 23.2.4.1, 23.2.5.1, 23.3.3.4 и 23.3.6.5) Все типы контейнеров, определенные в этом пункте, соответствуют следующим дополнительным требованиям:

- Если исключение брошено функцией вставки () или Emplace () Вставка одного элемента, эта функция не имеет эффектов.
- если исключение брошено функцией push_back () или push_front (), Эта функция не имеет эффектов.

- Нет стирания (), CLEAR (), POP_BABK () или POP_FRONT () Функция бросает Исключение.
- Нет копий конструктора или оператора назначения возвращенного итератора бросает исключение.
- Нет SWAP () функции бросает исключение.
- Нет SWAP () Функция недействительна любые ссылки, указатели или Итераторы со ссылкой на элементы контейнеров поменяются.

Причуды, указанные в соответствующих разделах, упомянутых выше (каждая называемая гарантиями безопасности исключений), в основном, в основном о специальных случаях на стенах, таких как при работе с исключениями из хранилища «СОДЕРЖИРОВАННЫЕ Типы», «Сравнительные операции», а также бросание отключения. и бросать операции перемещения.

Другие советы

N3376

23.2.1 Общие требования к контейнерам [Container.Requirements.general]

Пункт 10

Если не указано иное (см. 23.2.4.1, 23.2.5.1, 23.3.3.4 и 23.3.6.5) Все типы контейнеров, определенные в этом пункте, соответствуют следующим дополнительным требованиям:
- Если исключение брошено функцией вставки () или Emplace () при вставке одного элемента, эта функция не имеет эффектов.

- Если исключение брошено функцией push_back () или push_front (), эта функция не имеет эффектов.
- Нет стирания (), CLEAR (), POP_BABK () или POP_FRONT () Функция выдает исключение.
- Нет копий конструктора или оператора назначения возвращаемого итератора бросает исключение.
- Нет SWAP () функции бросает исключение.
- Нет SWAP () Функции недействителенными любыми ссылками, указателями или итераторами, относящиеся к элементам обмошенных элементах контейнеров.

[Примечание. Итератор END () не относится к ни одному элементу, поэтому он может быть недействительным. -Ендоне]

23.2.4 Ассоциативные контейнеры [Assessiative.reqmts]

23.2.4.1 гарантии безопасности исключения [Asshiative.reqmts.except]

1 для ассоциативных контейнеров, не понятная () функция бросает исключение. Стереть (k) не бросает исключение, если только исключение не брошено объектом сравнения контейнера (если есть).

2 Для ассоциативных контейнеров, если исключение брошено любую операцию изнутри функции вставки или Emplace, вставляющей один элемент, вставка не имеет эффекта.


3 Для ассоциативных контейнеров функция SWAP не выдает исключение, если только исключение не бросается на обмен объекта сравнения контейнера (если есть).

23.2.5 Неупорядоченные ассоциативные контейнеры [unord.req]

23.2.5.1 гарантии безопасности исключения [unord.req.except]

1 Для неупорядоченных ассоциативных контейнеров не понятна () функция бросает исключение. Стереть (k) не бросает исключение, если это исключение не брошено объектом HASH или PRES CHASH или PRES (если есть).

2 Для неупорядоченных ассоциативных контейнеров, если исключение брошено любую эксплуатацию, отличную от хеша контейнера изнутри функции вставки или Emplace, вставляющей один элемент, вставка не имеет эффекта.



3 Для неупорядоченных ассоциативных контейнеров не предупреждают функцию SWAP не выдают исключение, если только исключение не выброшено на обмен объекта хэш-контейнера или PRES (если есть).
4 Для неупорядоченных ассоциативных контейнеров, если исключение бросается из функции RefaSh (), отличной от функции хеша контейнера или функцией сравнения, функция REFASH () не имеет никакого эффекта.

23.3.3.4 Модификаторы DECE [DECE.Modifiers]

void push_back (t && x); Пункт 2

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

Итератор стирает (сначала const_iterator, const_iterator last); Пункт 6

бросает: ничего, если исключение не выброшено конструктором копирования, перемещать конструктор, оператор назначения или переместить оператор назначения T.

23.3.6.5 Векторные модификаторы [Vector.modifiers]

void push_back (t && x); Пункт 2

Если исключение выброшено с помощью конструктора движения не копированного T, эффекты не указаны.

Итератор стирает (сначала const_iterator, const_iterator last); Пункт 5

бросает: ничего, если исключение не выброшено конструктором копирования, перемещать конструктор, оператор назначения или переместить оператор назначения T.

Документ, который вы связали, проект N3337 STANDEL, можно рассматривать как официальный. Это стандарт C ++ 11 плюс незначительные редакционные изменения.

Вам просто нужно научиться читать стандарт, что понятно, потому что он не предназначен для легкого чтения.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top