std::invalid_argument
Определено в заголовочном файле <stdexcept> | ||
class invalid_argument; | ||
Определяет тип объекта, который бросается как исключение. Он сообщает об ошибках, возникающих из-за того, что значение аргумента не было принято.
Это исключение генерируется функциями std::bitset::bitset и семействами функций std::stoi и std::stof.
Диаграмма наследования
Содержание |
[править]Функции-элементы
(конструктор) | создаёт новый объект invalid_argument с заданным сообщением (public функция-элемент) |
operator= | заменяет объект invalid_argument (public функция-элемент) |
std::invalid_argument::invalid_argument
invalid_argument(conststd::string& what_arg ); | (1) | |
invalid_argument(constchar* what_arg ); | (2) | |
(3) | ||
invalid_argument(const invalid_argument& other ); | (до C++11) | |
invalid_argument(const invalid_argument& other )noexcept; | (начиная с C++11) | |
std::invalid_argument
, тогда std::strcmp(what(), other.what())==0. Исключения не могут быть сгенерированы из конструктора копирования.(до C++11)Параметры
what_arg | — | пояснительная строка |
other | — | другой объект исключения для копирования |
Исключения
Примечание
Поскольку при копировании std::invalid_argument
не разрешается создавать исключения, это сообщение обычно хранится внутри в виде отдельно выделенной строки с подсчётом ссылок. По этой же причине нет конструктора, принимающего std::string&&
: ему всё равно пришлось бы копировать содержимое.
До разрешения LWG проблема 254, некопирующий конструктор может принимать только std::string. Это делает динамическое размещение обязательным для создания объекта std::string.
После разрешения LWG проблема 471, производный стандартный класс исключения должен иметь общедоступный конструктор копирования. Его можно определить неявно, если поясняющие строки, полученные с помощью what()
, одинаковы для исходного объекта и скопированного объекта.
std::invalid_argument::operator=
invalid_argument& operator=(const invalid_argument& other ); | (до C++11) | |
invalid_argument& operator=(const invalid_argument& other )noexcept; | (начиная с C++11) | |
Присваивает содержимое из other. Если *this и other имеют динамический тип std::invalid_argument
, тогда std::strcmp(what(), other.what())==0 после присваивания. Оператор присваивания копированием не может вызвать исключение.(до C++11)
Параметры
other | — | другой объект исключения для присваивания |
Возвращаемое значение
*this
Примечание
После разрешения LWG проблема 471, производный стандартный класс исключения должен иметь общедоступный оператор присваивания копированием. Его можно определить неявно, если поясняющие строки, полученные с помощью what()
, одинаковы для исходного объекта и скопированного объекта.
Унаследован от std::logic_error
Унаследован от std::exception
Функции-элементы
[virtual] | уничтожает объект исключения (virtual public of std::exception функция-элемент) |
[virtual] | возвращает поясняющую строку (virtual public of std::exception функция-элемент) |
[править]Примечание
Цель этого типа исключения аналогична условию ошибки std::errc::invalid_argument (выброшенному в std::system_error из функций-элементов std::thread) и соответствующей константе errno EINVAL.
[править]Пример
#include <bitset>#include <iostream>#include <stdexcept>#include <string> int main(){try{std::bitset<4>{"012"};// Генерирует: ожидается только '0' или '1'}catch(std::invalid_argumentconst& ex){std::cout<<"#1: "<< ex.what()<<'\n';} try{[[maybe_unused]]int f =std::stoi("ABBA");// Генерирует: no conversion}catch(std::invalid_argumentconst& ex){std::cout<<"#2: "<< ex.what()<<'\n';} try{[[maybe_unused]]float f =std::stof("(3.14)");// Генерирует: no conversion}catch(std::invalid_argumentconst& ex){std::cout<<"#3: "<< ex.what()<<'\n';}}
Возможный вывод:
#1: bitset string ctor has invalid argument #2: stoi: no conversion #3: stof: no conversion
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 254 | C++98 | конструктор, принимающий constchar*, отсутствовал | добавлен |
LWG 471 | C++98 | пояснительные строки копий std::invalid_argument были определены реализацией | они такие же, как у исходного объектаstd::invalid_argument |