Spec-Zone.ru › C++

std::range_error

Определён в заголовке <stdexcept>
class range_error;

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

Единственные компоненты стандартной библиотеки, выбрасывающие это исключение, — std::wstring_convert::from_bytes и std::wstring_convert::to_bytes.

Математические функции в компонентах стандартной библиотеки не выбрасывают это исключение (математические функции сообщают об ошибках диапазона в соответствии с math_errhandling).

cpp/error/exception cpp/error/runtime error

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

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

(constructor)
создаёт новый объект range_error с указанным сообщением
(открытая функция-член)
operator=
заменяет объект range_error
(открытая функция-член)

std::range_error::range_error

range_error( const std::string& what_arg );
(1)
range_error( const char* what_arg );
(2)
range_error( const range_error& other );
(3) (без исключений начиная с C++11)
1) Создаёт объект исключения, используя what_arg в качестве пояснительной строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.
2) Создаёт объект исключения, используя what_arg в качестве пояснительной строки. После создания std::strcmp(what(), what_arg) == 0.
3) Конструктор копирования. Если *this и other имеют динамический тип std::range_error, то std::strcmp(what(), other.what()) == 0. Конструктор копирования не может выбросить исключение.

Параметры

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

Исключения

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

Примечания

Поскольку копирование std::range_error не должно выбрасывать исключения, это сообщение обычно хранится внутри в виде отдельно выделенной строки со счётчиком ссылок. По этой же причине нет конструктора, принимающего std::string&&: в любом случае пришлось бы копировать содержимое.

До принятия решения по вопросу LWG 254 некопирующий конструктор мог принимать только std::string. Для создания объекта std::string требовалось обязательное динамическое выделение памяти.

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

std::range_error::operator=

range_error& operator=( const range_error& other );
(без исключений начиная с C++11)

Присваивает содержимое из other. Если *this и other имеют динамический тип std::range_error, то после присваивания std::strcmp(what(), other.what()) == 0. Оператор присваивания копированием не может выбросить исключение.

Параметры

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

Возвращаемое значение

*this

Примечания

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

Наследуется от std::runtime_error

Наследуется от std::exception

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

(деструктор)
[виртуальная]
уничтожает объект исключения
(виртуальная открытая функция-член класса std::exception)
what
[виртуальная]
возвращает пояснительную строку
(виртуальная открытая функция-член класса std::exception)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Правильное поведение
LWG 254 C++98 отсутствовал конструктор, принимающий const char* добавлен
LWG 471 C++98 пояснительные строки копий std::range_error
определялись реализацией
они совпадают с пояснительной строкой
исходного объекта std::range_error

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/range_error

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API