Namespaces
Variants

std:: overflow_error

From cppreference.net
Определено в заголовочном файле <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 при вычислении константного выражения.

Однако объекты std::overflow_error обычно не могут быть constexpr , поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.

(since C++26)
cpp/error/exception cpp/error/runtime error std-overflow error-inheritance.svg

Диаграмма наследования

Содержание

Функции-члены

(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)
1) Создает объект исключения с what_arg в качестве поясняющей строки. После создания, std:: strcmp ( what ( ) , what_arg. c_str ( ) ) == 0 .
2) Создает объект исключения с what_arg в качестве поясняющей строки. После создания, std:: strcmp ( what ( ) , what_arg ) == 0 .
3) Конструктор копирования. Если * this и other оба имеют динамический тип std::overflow_error , то std:: strcmp ( what ( ) , other. what ( ) ) == 0 . Из конструктора копирования не может быть выброшено исключение.

Параметры

what_arg - поясняющая строка
other - другой объект исключения для копирования

Исключения

1,2) Может выбрасывать std::bad_alloc .

Примечания

Поскольку копирование 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