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
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> invalid_argument( const std::string& what_arg ); |
(1) | |
invalid_argument( const char* what_arg ); |
(2) | |
| (3) | ||
invalid_argument( const invalid_argument& other ); |
(до C++11) | |
invalid_argument( const invalid_argument& 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::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=
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody> 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_argument const& ex)
{
std::cout << "#1: " << ex.what() << '\n';
}
try
{
[[maybe_unused]] int f = std::stoi("ABBA"); // Генерирует: no conversion
}
catch (std::invalid_argument const& ex)
{
std::cout << "#2: " << ex.what() << '\n';
}
try
{
[[maybe_unused]] float f = std::stof("(3.14)"); // Генерирует: no conversion
}
catch (std::invalid_argument const& 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 | конструктор, принимающий const char*, отсутствовал
|
добавлен |
| LWG 471 | C++98 | пояснительные строки копий std::invalid_argumentбыли определены реализацией |
они такие же, как у исходного объектаstd::invalid_argument
|