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