Spec-Zone.ru › C++

std::length_error

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

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

Это исключение выбрасывается функциями-членами std::basic_string и std::vector::reserve.

cpp/error/exception cpp/error/logic errorstd-length error-inheritance.svg

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

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

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

std::length_error::length_error

length_error( const std::string& what_arg );
(1)
length_error( const char* what_arg );
(2)
(3)
length_error( const length_error& other );
(до C++11)
length_error( const length_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::length_error, то std::strcmp(what(), other.what()) == 0. Ни одно исключение не может быть выброшено из конструктора копирования.(до C++11)

Параметры

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

Исключение

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

Примечания

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

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

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

std::length_error::operator=

length_error& operator=( const length_error& other );
(до C++11)
length_error& operator=( const length_error& other ) noexcept;
(с C++11)

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

Параметры

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

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

*this

Примечания

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

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

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

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

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

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

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

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

См. также

resize
изменяет количество хранимых символов
(публичная функция-член std::basic_string<CharT,Traits,Allocator>)

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

Spec-Zone.ru

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