Spec-Zone.ru › C++

std::invalid_argument

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

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

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

cpp/error/exception cpp/error/logic errorstd-invalid argument-inheritance.svg

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

Члены-функции

(конструктор)
создает новый объект 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)
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. Исключение не может быть брошено из конструктора копирования.(до C++11)

Параметры

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 );
(до 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)
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++.

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

Spec-Zone.ru

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