◐ Shell
clean mode source ↗

std::logic_error — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

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.

cpp/error/exception

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

Функции-элементы

создаёт новый объект logic_error с заданным сообщением
(public функция-элемент)
заменяет объект logic_error
(public функция-элемент)

std::logic_error::logic_error

<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>

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)

1) Создаёт объект исключения с what_arg в качестве пояснительной строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.

2) Создаёт объект исключения с what_arg в качестве пояснительной строки. После создания std::strcmp(what(), what_arg) == 0.

3) Конструктор копирования. Если *this и other имеют динамический тип std::logic_error, тогда std::strcmp(what(), other.what()) == 0. Исключения не могут быть сгенерированы из конструктора копирования. (до C++11)

Параметры

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

Исключения

1,2) Может генерировать std::bad_alloc.

Примечание

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

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

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

std::logic_error::operator=

<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>

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 проблема 471, производный стандартный класс исключения должен иметь общедоступный оператор присваивания копированием. Его можно определить неявно, если поясняющие строки, полученные с помощью what(), одинаковы для исходного объекта и скопированного объекта.

Унаследован от std::exception

Функции-элементы

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

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

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