Namespaces
Variants

std:: invalid_argument

From cppreference.net
Определено в заголовке <stdexcept>
class invalid_argument ;

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

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

Все функции-члены std::invalid_argument являются constexpr : возможно создавать и использовать объекты std::invalid_argument при вычислении константного выражения.

Однако, объекты std::invalid_argument обычно не могут быть constexpr , поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.

(since C++26)
cpp/error/exception cpp/error/logic error std-invalid argument-inheritance.svg

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

Содержание

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

(constructor)
создает новый объект invalid_argument с заданным сообщением
(public member function)
operator=
заменяет объект invalid_argument
(public member function)

std::invalid_argument:: invalid_argument

invalid_argument ( const std:: string & what_arg ) ;
(1) (constexpr since C++26)
invalid_argument ( const char * what_arg ) ;
(2) (constexpr since C++26)
invalid_argument ( const invalid_argument & other ) ;
(3) (noexcept since C++11)
(constexpr since C++26)
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 issue 254 , не копирующий конструктор мог принимать только std::string . Это делало динамическое выделение памяти обязательным для создания объекта std::string .

После решения LWG issue 471 , производный класс стандартного исключения должен иметь публично доступный конструктор копирования. Он может быть неявно определен, если поясняющие строки, полученные с помощью what() , одинаковы для исходного объекта и скопированного объекта.

std::invalid_argument:: operator=

invalid_argument & operator = ( const invalid_argument & other ) ;
(noexcept since C++11)
(constexpr since C++26)

Присваивает содержимое из объекта other . Если * this и other оба имеют динамический тип std::invalid_argument , то std:: strcmp ( what ( ) , other. what ( ) ) == 0 после присваивания. Оператор копирующего присваивания не может генерировать исключения.

Параметры

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

Возвращаемое значение

* this

Примечания

После решения LWG issue 471 , производный класс стандартного исключения должен иметь публично доступный оператор копирующего присваивания. Он может быть неявно определен, если пояснительные строки, полученные с помощью what() , одинаковы для исходного объекта и скопированного объекта.

Унаследовано от std:: logic_error

Унаследовано от std:: exception

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

[virtual]
уничтожает объект исключения
(виртуальная публичная функция-член std::exception )
[virtual]
возвращает поясняющую строку
(виртуальная публичная функция-член std::exception )

Примечания

Назначение этого типа исключения аналогично условию ошибки std::errc::invalid_argument (выбрасываемому в std::system_error из функций-членов std::thread ) и связанной константе errno EINVAL .

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_constexpr_exceptions 202502L (C++26) constexpr типы исключений

Пример

#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"); // Исключение: преобразование невозможно
    }
    catch (std::invalid_argument const& ex)
    {
        std::cout << "#2: " << ex.what() << '\n';
    }
    try
    {
        [[maybe_unused]] float f = std::stof("(3.14)"); // Исключение: преобразование невозможно
    }
    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 Applied to Behavior as published Correct behavior
LWG 254 C++98 конструктор, принимающий const char * отсутствовал добавлен
LWG 471 C++98 пояснительные строки копий std::invalid_argument
были определяемыми реализацией
они совпадают с таковыми у исходного
объекта std::invalid_argument