Требования к исключению на стандартных контейнерах

С++ 11 §23.2.1.10 указывает:

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

  • если исключение генерируется функцией insert() или emplace() при вставке одного элемента, эта функция не имеет эффектов.
  • Функция erase(), clear(), pop_back() или pop_front() генерирует исключение.

Что касается первого пункта, как контейнер гарантирует это? Конструктор для T может иметь побочные эффекты. Если это не " не влияет на контейнер"

Что касается второй точки, она обычно вызывает allocator::deallocate(T*,size_t), которая не является noexcept. Почему следует исключать возможные исключения?

Ответы

Ответ 1

В таблице 28 указано, что одним из требований распределителя является то, что deallocate() "Не выбрасывает исключения". Таким образом, стандарт может сделать утверждение о erase(), clear(), pop_back() и pop_front()