std::underflow_error
Определено в заголовочном файле <stdexcept> | ||
|---|---|---|
class underflow_error; |
Определяет тип объекта, который можно выбрасывать как исключение. Его можно использовать для сообщения об ошибках арифметического антипереполнения (то есть ситуациях, когда результат вычисления является субнормальным значением с плавающей точкой).
Компоненты стандартной библиотеки не выбрасывают это исключение (математические функции сообщают об ошибках антипереполнения согласно math_errhandling). Однако это исключение используется сторонними библиотеками. Например, boost.math выбрасывает std::underflow_error, если включён boost::math::policies::throw_on_error (настройка по умолчанию).
Диаграмма наследования
Функции-члены
|
(constructor) | создаёт новый объект underflow_error с заданным сообщением (открытая функция-член) |
|
operator= | заменяет объект underflow_error (открытая функция-член) |
std::underflow_error::underflow_error
underflow_error( const std::string& what_arg ); | (1) | |
underflow_error( const char* what_arg ); | (2) | |
underflow_error( const underflow_error& other ); | (3) | (noexcept начиная с C++11) |
what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg) == 0.*this и other имеют динамический тип std::underflow_error, то std::strcmp(what(), other.what()) == 0. Конструктор копирования не может выбрасывать исключения.Параметры
| what_arg | - | поясняющая строка |
| other | - | другой объект исключения для копирования |
Исключения
std::bad_alloc.Примечания
Поскольку копирование std::underflow_error не должно приводить к выбрасыванию исключений, это сообщение обычно хранится внутри в виде отдельно выделенной строки со счётчиком ссылок. По этой же причине отсутствует конструктор, принимающий std::string&&: содержимое в любом случае пришлось бы копировать.
До принятия решения по вопросу LWG 254 конструктор, отличный от конструктора копирования, мог принимать только std::string. Для создания объекта std::string требовалось обязательное динамическое выделение памяти.
После принятия решения по вопросу LWG 471 производный класс стандартного исключения должен иметь общедоступный конструктор копирования. Его можно определить неявно, если поясняющие строки, полученные с помощью what(), совпадают у исходного объекта и его копии.
std::underflow_error::operator=
underflow_error& operator=( const underflow_error& other ); | (noexcept начиная с C++11) |
Присваивает содержимое объекта, используя содержимое other. Если *this и other имеют динамический тип std::underflow_error, то после присваивания std::strcmp(what(), other.what()) == 0. Оператор присваивания копированием не может выбрасывать исключения.
Параметры
| other | - | другой объект исключения для присваивания |
Возвращаемое значение
*this
Примечания
После принятия решения по вопросу LWG 471 производный класс стандартного исключения должен иметь общедоступный оператор присваивания копированием. Его можно определить неявно, если поясняющие строки, полученные с помощью what(), совпадают у исходного объекта и его копии.
Унаследовано от std::runtime_error
Унаследовано от std::exception
Функции-члены
|
[виртуальная] | уничтожает объект исключения (виртуальная открытая функция-член std::exception) |
|
[виртуальная] | возвращает поясняющую строку (виртуальная открытая функция-член std::exception) |
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 254 | C++98 | отсутствовал конструктор, принимающий const char* | добавлен |
| LWG 471 | C++98 | поясняющие строки копий std::underflow_errorзависели от реализации | они совпадают с поясняющей строкой исходного объекта std::underflow_error |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/underflow_error