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.
Схема наследования
Члены-функции
| (конструктор) | создает новый объект 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) | |
| (3) | ||
logic_error( const logic_error& other ); | (до C++11) | |
logic_error( const logic_error& other ) 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. Исключение бросить нельзя из конструктора копирования.(до C++11)
Параметры
| what_arg | - | строка описания |
| other | - | другой объект исключения для копирования |
Исключения
std::bad_alloc.Примечания
Поскольку копирование std::logic_error запрещено выбрасывать исключения, это сообщение обычно хранится внутри как отдельная строка с подсчетом ссылок. Вот почему нет конструктора, принимающего std::string&&: пришлось бы копировать содержимое в любом случае.
До решения проблемы LWG issue 254, конструктор без копирования может принимать только std::string. Это делает обязательной динамическую аллокация для построения объекта std::string.
После решения проблемы LWG issue 471, производный стандартный класс исключения должен иметь доступный в публичном доступе конструктор копирования. Он может быть неявно определен, если строки описания, полученные из what(), совпадают для исходного объекта и скопированного объекта.
std::logic_error::operator=
logic_error& operator=( const logic_error& other ); | (до C++11) | |
logic_error& operator=( const logic_error& other ) noexcept; | (с C++11) |
Присваивает содержимое объекта other. Если *this и other оба имеют динамический тип std::logic_error то std::strcmp(what(), other.what()) == 0 после присваивания. Исключение бросить нельзя из оператора копирующего присваивания.(до C++11)
Параметры
| other | - | другой объект исключения для присваивания |
Возвращаемое значение
*this
Примечания
После решения проблемы LWG issue 471, производный стандартный класс исключения должен иметь доступный в публичном доступе оператор копирующего присваивания. Он может быть неявно определен, если строки описания, полученные из what() , совпадают для исходного объекта и скопированного объекта.
Наследуется от std::exception
Члены-функции
|
[virtual] | уничтожает объект исключения (виртуальная публичная функция-член std::exception) |
|
[virtual] | возвращает строку описания (виртуальная публичная функция-член std::exception) |
Отчеты об ошибках
Следующие отчеты об ошибках, которые изменяли поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/error/logic_error