Spec-Zone.ru › C++

std::invalid_argument

Определено в заголовочном файле <stdexcept>
class invalid_argument;

Определяет тип объекта, который выбрасывается как исключение. Сообщает об ошибках, возникающих из-за того, что значение аргумента не было принято.

Это исключение выбрасывается функцией std::bitset::bitset, а также семействами функций std::stoi и std::stof.

cpp/error/exception cpp/error/logic error

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

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

(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)
1) Создаёт объект исключения, используя what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.
2) Создаёт объект исключения, используя what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg) == 0.
3) Конструктор копирования. Если *this и other имеют динамический тип std::invalid_argument, то std::strcmp(what(), other.what()) == 0. Конструктор копирования не может выбрасывать исключения.

Параметры

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

Исключения

1,2) Может выбросить 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

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

(destructor)
[виртуальная]
уничтожает объект исключения
(виртуальная открытая функция-член std::exception)
what
[виртуальная]
возвращает поясняющую строку
(виртуальная открытая функция-член 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

Spec-Zone.ru

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