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

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

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

3 ответа

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

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

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

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

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

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

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

    E. 4 Стандартные Гарантии Контейнера

    Если библиотечная операция сама создает исключение, она может – и делает –
    убедитесь, что объекты, на которых он работает, оставлены в
    четко определенное состояние. Например, at () throwing out_of_range for a
    vector (§16.3.3) не является проблемой с безопасностью исключений для вектора
    . Автор at() не имеет никаких проблем, убедившись, что вектор находится в
    четко определенное состояние перед броском.

    Кроме того, раздел E. 4.1 государства

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

    взгляните на страницу 956. Он содержит таблицу гарантий для различных операций для вектора, деке, списка и карты.
    Таким образом, все операции над этими контейнерами являются nothrow или strong, за исключением вставки N — элемента в map, которая предлагает основные гарантии.

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

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

    стандартные первые состояния, о контейнерах
    array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack:
    на

    23.2.1/10:

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

    — если исключение создается функцией insert () или emplace (), то
    вставка одного элемента, эта функция не имеет никаких эффектов.
    — если исключение создается функцией push_back() или push_front() ,
    эта функция не имеет никаких эффектов.
    — функция no erase(), clear(), pop_back() или pop_front() выбрасывает
    исключение.
    — отсутствие конструктора копирования или оператора назначения возвращенного итератора
    выдать исключение.
    — функция no swap () создает исключение.
    — функция no swap () делает недействительными любые ссылки, указатели или
    итераторы, ссылающиеся на элементы меняемых контейнеров.

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

  3. n3376

    23.2.1 общие требования к контейнеру [контейнер.требования.генеральный]

    Пункт 10

    Если не указано иное (см. 23.2.4.1, 23.2.5.1, 23.3.3.4 и 23.3.6.5), все типы контейнеров, определенные в настоящем пункте, удовлетворяют следующим дополнительным требованиям:
    — если исключение создается функцией insert() или emplace () при вставке одного элемента, эта функция не имеет никаких эффектов.
    — если исключение создается функцией push_back() или push_front (), то эта функция не имеет никаких эффектов.
    — функция no erase(), clear(), pop_back() или pop_front() создает исключение.
    — ни один конструктор копирования или оператор назначения возвращаемого итератора не создает исключения.
    — функция no swap () создает исключение.
    — функция no swap () делает недействительными любые ссылки, указатели или итераторы, ссылающиеся на элементы меняемых контейнеров.
    [Примечание: итератор end () не ссылается на какой-либо элемент, поэтому он может быть признан недействительным. —Примечание]

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

    23.2.4.1 гарантии безопасности исключений [ассоциативный.reqmts.кроме]

    1 для ассоциативных контейнеров функция clear() не создает исключение. erase (k) не создает исключение, если это исключение не создается объектом Compare контейнера (если таковой имеется).
    2 для ассоциативных контейнеров, если исключение создается какой-либо операцией из функции insert или emplace, вставляющей один элемент, вставка не имеет эффекта.
    3 для ассоциативных контейнеров ни одна функция swap не создает исключение, если это исключение не создается свопом объекта Compare контейнера (если таковой имеется).

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

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

    1 для неупорядоченных ассоциативных контейнеров функция clear() не создает исключения. erase (k) не создает исключение, если это исключение не создается хэшем контейнера или Pred-объектом (если таковой имеется).
    2 для неупорядоченных ассоциативных контейнеров, если исключение создается какой-либо операцией, отличной от хэш-функции контейнера, из функции insert или emplace, вставляющей один элемент, вставка не имеет эффекта.
    3 для неупорядоченных ассоциативных контейнеров ни одна функция swap не создает исключение, если это исключение не вызвано заменой хэша контейнера или объекта Pred (если таковой имеется).
    4 для неупорядоченных ассоциативных контейнеров, если исключение создается из функции rehash (), отличной от хэш-функции контейнера или функции сравнения, функция rehash () не имеет эффекта.

    23.3.3.4 модификаторы deque [deque.модификаторы]

    void push_back (T&& x); пункт 2

    Примечания: если исключение создается не конструктором копирования, конструктором перемещения, оператором назначения или оператором назначения перемещения T, то никаких эффектов не возникает. Если исключение создается конструктором move для не-CopyInsertable T, эффекты не указаны.

    iterator erase (const_iterator первый, const_iterator последний); параграф 6

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

    23.3.6.5 модификаторы векторов [vector.модификаторы]

    void push_back (T&& x); пункт 2

    Если исключение создается конструктором move для не-CopyInsertable T, эффекты не указаны.

    iterator erase (const_iterator первый, const_iterator последний); параграф 5

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