std:: overflow_error
|
Определено в заголовочном файле
<stdexcept>
|
||
|
class
overflow_error
;
|
||
Определяет тип объекта, который будет выброшен как исключение. Он может использоваться для сообщения об ошибках арифметического переполнения (то есть ситуаций, когда результат вычисления слишком велик для целевого типа).
|
Единственный компонент стандартной библиотеки, который выбрасывает это исключение - std::bitset::to_ulong . |
(до C++11) |
|
Единственные компоненты стандартной библиотеки, которые выбрасывают это исключение - std::bitset::to_ulong и std::bitset::to_ullong . |
(начиная с C++11) |
Математические функции компонентов стандартной библиотеки не выбрасывают это исключение (математические функции сообщают об ошибках переполнения, как указано в
math_errhandling
). Однако сторонние библиотеки используют его. Например,
boost.math
выбрасывает
std::overflow_error
если
boost::math::policies::throw_on_error
включена (настройка по умолчанию).
Все функции-члены
std::overflow_error
являются
constexpr
: возможно создавать и использовать объекты
std::overflow_error
при вычислении константного выражения.
Однако объекты
|
(since C++26) |
Диаграмма наследования
Содержание |
Функции-члены
|
(constructor)
|
создает новый объект
overflow_error
с заданным сообщением
(public member function) |
|
operator=
|
заменяет объект
overflow_error
(public member function) |
std::overflow_error:: overflow_error
|
overflow_error
(
const
std::
string
&
what_arg
)
;
|
(1) | (constexpr since C++26) |
|
overflow_error
(
const
char
*
what_arg
)
;
|
(2) | (constexpr since C++26) |
|
overflow_error
(
const
overflow_error
&
other
)
;
|
(3) |
(noexcept since C++11)
(constexpr since C++26) |
std::overflow_error
, то
std::
strcmp
(
what
(
)
, other.
what
(
)
)
==
0
. Из конструктора копирования не может быть выброшено исключение.
Параметры
| what_arg | - | поясняющая строка |
| other | - | другой объект исключения для копирования |
Исключения
Примечания
Поскольку копирование
std::overflow_error
не должно выбрасывать исключения, это сообщение обычно хранится внутри как отдельно выделенная строка с подсчетом ссылок. Это также объясняет, почему нет конструктора, принимающего
std::string&&
: в любом случае пришлось бы копировать содержимое.
До решения LWG issue 254 , не копирующий конструктор мог принимать только std::string . Это делало динамическое выделение памяти обязательным для создания объекта std::string .
После решения
LWG issue 471
, производный класс стандартного исключения должен иметь общедоступный конструктор копирования. Он может быть неявно определен, если поясняющие строки, полученные с помощью
what()
, одинаковы для исходного объекта и скопированного объекта.
std::overflow_error:: operator=
|
overflow_error
&
operator
=
(
const
overflow_error
&
other
)
;
|
(noexcept since C++11)
(constexpr since C++26) |
|
Присваивает содержимое объекта
other
. Если
*
this
и
other
оба имеют динамический тип
std::overflow_error
, то
std::
strcmp
(
what
(
)
, other.
what
(
)
)
==
0
после присваивания. Оператор копирующего присваивания не может генерировать исключения.
Параметры
| other | - | другой объект исключения для присваивания |
Возвращаемое значение
* this
Примечания
После решения
LWG issue 471
, производный класс стандартного исключения должен иметь общедоступный оператор копирующего присваивания. Он может быть неявно определен, пока пояснительные строки, полученные с помощью
what()
, одинаковы для исходного объекта и скопированного объекта.
Унаследовано от std:: runtime_error
Унаследовано от std:: exception
Функции-члены
|
[virtual]
|
уничтожает объект исключения
(виртуальная публичная функция-член
std::exception
)
|
|
[virtual]
|
возвращает поясняющую строку
(виртуальная публичная функция-член
std::exception
)
|
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_constexpr_exceptions
|
202502L
|
(C++26) | constexpr типы исключений |
Пример
#include <iostream> #include <limits> #include <stdexcept> #include <utility> template<typename T, int N> requires (N > 0) /*...*/ class Stack { int top_{-1}; T data_[N]; public: [[nodiscard]] bool empty() const { return top_ == -1; } void push(T x) { if (top_ == N - 1) throw std::overflow_error("Stack overflow!"); data_[++top_] = std::move(x); } void pop() { if (empty()) throw std::underflow_error("Stack underflow!"); --top_; } T const& top() const { if (empty()) throw std::overflow_error("Stack is empty!"); return data_[top_]; } }; int main() { Stack<int, 4> st; try { [[maybe_unused]] auto x = st.top(); } catch (std::overflow_error const& ex) { std::cout << "1) Exception: " << ex.what() << '\n'; } st.push(1337); while (!st.empty()) st.pop(); try { st.pop(); } catch (std::underflow_error const& ex) { std::cout << "2) Exception: " << ex.what() << '\n'; } try { for (int i{}; i != 13; ++i) st.push(i); } catch (std::overflow_error const& ex) { std::cout << "3) Exception: " << ex.what() << '\n'; } }
Вывод:
1) Exception: Stack is empty! 2) Exception: Stack underflow! 3) Exception: Stack overflow!
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 254 | C++98 | the constructor accepting const char * was missing | added |
| LWG 471 | C++98 |
the explanatory strings of
std::overflow_error
's
copies were implementation-defined |
they are the same as that of the
original
std::overflow_error
object
|