std::invalid_argument
Определено в заголовочном файле <stdexcept> | ||
|---|---|---|
class invalid_argument; |
Определяет тип объекта, который выбрасывается как исключение. Сообщает об ошибках, возникающих из-за того, что значение аргумента не было принято.
Это исключение выбрасывается функцией std::bitset::bitset, а также семействами функций std::stoi и std::stof.
Диаграмма наследования
Функции-члены
|
(constructor) | создаёт новый объект invalid_argument с указанным сообщением (открытая функция-член) |
|
operator= | заменяет объект invalid_argument (открытая функция-член) |
std::invalid_argument::invalid_argument
invalid_argument( const std::string& what_arg ); | (1) | |
invalid_argument( const char* what_arg ); | (2) | |
invalid_argument( const invalid_argument& other ); | (3) | (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. Конструктор копирования не может выбрасывать исключения.Параметры
| what_arg | - | поясняющая строка |
| other | - | другой объект исключения для копирования |
Исключения
std::bad_alloc.Примечания
Поскольку копирование 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 ); | (noexcept начиная с C++11) |
Присваивает содержимому содержимое other. Если *this и other имеют динамический тип std::invalid_argument, то после присваивания std::strcmp(what(), other.what()) == 0. Оператор копирующего присваивания не может выбрасывать исключения.
Параметры
| other | - | другой объект исключения, содержимое которого присваивается |
Возвращаемое значение
*this
Примечания
После принятия решения по вопросу LWG 471 производный класс стандартного исключения должен иметь общедоступный оператор копирующего присваивания. Его можно определить неявно, если поясняющие строки, полученные с помощью what(), одинаковы для исходного и скопированного объектов.
Унаследовано от std::logic_error
Унаследовано от std::exception
Функции-члены
|
[виртуальная] | уничтожает объект исключения (виртуальная открытая функция-член std::exception) |
|
[виртуальная] | возвращает поясняющую строку (виртуальная открытая функция-член 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"}; // Throws: only '0' or '1' expected
}
catch (std::invalid_argument const& ex)
{
std::cout << "#1: " << ex.what() << '\n';
}
try
{
[[maybe_unused]] int f = std::stoi("ABBA"); // Throws: no conversion
}
catch (std::invalid_argument const& ex)
{
std::cout << "#2: " << ex.what() << '\n';
}
try
{
[[maybe_unused]] float f = std::stof("(3.14)"); // Throws: 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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/invalid_argument