Spec-Zone.ru › C++

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.

cpp/error/exception

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

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

(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)
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. Конструктор копирования не может выбросить исключение.

Параметры

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=

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)
what
[виртуальная]
возвращает поясняющую строку
(виртуальная открытая функция-член класса 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

Spec-Zone.ru

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