|
|
Defined in header <stdexcept> | ||
class invalid_argument; | ||
Defines a type of object to be thrown as exception. It reports errors that arise because an argument value has not been accepted.
This exception is thrown bystd::bitset::bitset, and thestd::stoi andstd::stof families of functions.
All member functions ofstd::invalid_argument areconstexpr: it is possible to create and usestd::invalid_argument objects in the evaluation of a constant expression.However, | (since C++26) |
Inheritance diagram
Contents |
(constructor) | constructs a newinvalid_argument object with the given message(public member function) |
operator= | replaces theinvalid_argument object(public member function) |
invalid_argument(conststd::string& what_arg); | (1) | (constexpr since C++26) |
invalid_argument(constchar* what_arg); | (2) | (constexpr since C++26) |
invalid_argument(const invalid_argument& other); | (3) | (noexcept since C++11) (constexpr since C++26) |
std::invalid_argument
thenstd::strcmp(what(), other.what())==0. No exception can be thrown from the copy constructor.what_arg | - | explanatory string |
other | - | another exception object to copy |
Because copyingstd::invalid_argument
is not permitted to throw exceptions, this message is typically stored internally as a separately-allocated reference-counted string. This is also why there is no constructor takingstd::string&&
: it would have to copy the content anyway.
Before the resolution ofLWG issue 254, the non-copy constructor can only acceptstd::string. It makes dynamic allocation mandatory in order to construct astd::string object.
After the resolution ofLWG issue 471, a derived standard exception class must have a publicly accessible copy constructor. It can be implicitly defined as long as the explanatory strings obtained bywhat()
are the same for the original object and the copied object.
invalid_argument& operator=(const invalid_argument& other); | (noexcept since C++11) (constexpr since C++26) | |
Assigns the contents with those ofother. If*this andother both have dynamic typestd::invalid_argument
thenstd::strcmp(what(), other.what())==0 after assignment. No exception can be thrown from the copy assignment operator.
other | - | another exception object to assign with |
*this
After the resolution ofLWG issue 471, a derived standard exception class must have a publicly accessible copy assignment operator. It can be implicitly defined as long as the explanatory strings obtained bywhat()
are the same for the original object and the copied object.
[virtual] | destroys the exception object (virtual public member function of std::exception )[edit] |
[virtual] | returns an explanatory string (virtual public member function of std::exception )[edit] |
The purpose of this exception type is similar to the error conditionstd::errc::invalid_argument (thrown instd::system_error from member functions ofstd::thread) and the related errno constantEINVAL.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_constexpr_exceptions | 202502L | (C++26) | constexpr exception types |
#include <bitset>#include <iostream>#include <stdexcept>#include <string> int main(){try{std::bitset<4>{"012"};// Throws: only '0' or '1' expected}catch(std::invalid_argumentconst& ex){std::cout<<"#1: "<< ex.what()<<'\n';} try{[[maybe_unused]]int f=std::stoi("ABBA");// Throws: no conversion}catch(std::invalid_argumentconst& ex){std::cout<<"#2: "<< ex.what()<<'\n';} try{[[maybe_unused]]float f=std::stof("(3.14)");// Throws: no conversion}catch(std::invalid_argumentconst& ex){std::cout<<"#3: "<< ex.what()<<'\n';}}
Possible output:
#1: bitset string ctor has invalid argument#2: stoi: no conversion#3: stof: no conversion
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 254 | C++98 | the constructor acceptingconstchar* was missing | added |
LWG 471 | C++98 | the explanatory strings ofstd::invalid_argument 'scopies were implementation-defined | they are the same as that of the original std::invalid_argument object |