std::invalid_argument
Определено в заголовке <stdexcept> | ||
|---|---|---|
class invalid_argument; |
Определяет тип объекта, который должен быть брошен как исключение. Он сообщает об ошибках, возникающих из-за того, что значение аргумента не было принято.
Это исключение выбрасывается std::bitset::bitset, и семейства функций std::stoi и std::stof.
Диаграмма наследования
Члены-функции
| (конструктор) | создает новый объект 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) | |
| (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::bad_alloc. Примечания
Поскольку копирование std::invalid_argument не допускается для выброса исключений, это сообщение обычно хранится в виде отдельной выделенной в памяти строки с подсчётом ссылок. Это также объясняет, почему не существует конструктора, принимающего std::string&&: он всё равно должен был бы скопировать содержимое.
До решения LWG issue 254, некопирующий конструктор может принимать только std::string. Он делает выделение памяти динамическим, чтобы создать объект std::string.
После решения LWG issue 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 issue 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++.
| DR | Применён к | Поведение как опубликовано | Правильное поведение |
|---|---|---|---|
| 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/w/cpp/error/invalid_argument