|
|
Defined in header <stdexcept> | ||
class overflow_error; | ||
Defines a type of object to be thrown as exception. It can be used to report arithmetic overflow errors (that is, situations where a result of a computation is too large for the destination type).
The only standard library component that throws this exception isstd::bitset::to_ulong. | (until C++11) |
The only standard library components that throw this exception arestd::bitset::to_ulong andstd::bitset::to_ullong. | (since C++11) |
The mathematical functions of the standard library components do not throw this exception (mathematical functions report overflow errors as specified inmath_errhandling). Third-party libraries, however, use this. For example,boost.math throwsstd::overflow_error
ifboost::math::policies::throw_on_error
is enabled (the default setting).
All member functions ofstd::overflow_error areconstexpr: it is possible to create and usestd::overflow_error objects in the evaluation of a constant expression.However, | (since C++26) |
Inheritance diagram
Contents |
(constructor) | constructs a newoverflow_error object with the given message(public member function) |
operator= | replaces theoverflow_error object(public member function) |
overflow_error(conststd::string& what_arg); | (1) | (constexpr since C++26) |
overflow_error(constchar* what_arg); | (2) | (constexpr since C++26) |
overflow_error(const overflow_error& other); | (3) | (noexcept since C++11) (constexpr since C++26) |
std::overflow_error
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::overflow_error
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.
overflow_error& operator=(const overflow_error& other); | (noexcept since C++11) (constexpr since C++26) | |
Assigns the contents with those ofother. If*this andother both have dynamic typestd::overflow_error
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] |
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_constexpr_exceptions | 202502L | (C++26) | constexpr exception types |
#include <iostream>#include <limits>#include <stdexcept>#include <utility> template<typename T,int N> requires(N>0)/*...*/class Stack{int top_{-1}; T data_[N]; public:[[nodiscard]]bool empty()const{return top_==-1;} void push(T x){if(top_== N-1)throw std::overflow_error("Stack overflow!"); data_[++top_]= std::move(x);} void pop(){if(empty())throwstd::underflow_error("Stack underflow!");--top_;} Tconst& top()const{if(empty())throw std::overflow_error("Stack is empty!");return data_[top_];}}; int main(){ Stack<int,4> st; try{[[maybe_unused]]auto x= st.top();}catch(std::overflow_errorconst& ex){std::cout<<"1) Exception: "<< ex.what()<<'\n';} st.push(1337);while(!st.empty()) st.pop(); try{ st.pop();}catch(std::underflow_errorconst& ex){std::cout<<"2) Exception: "<< ex.what()<<'\n';} try{for(int i{}; i!=13;++i) st.push(i);}catch(std::overflow_errorconst& ex){std::cout<<"3) Exception: "<< ex.what()<<'\n';}}
Output:
1) Exception: Stack is empty!2) Exception: Stack underflow!3) Exception: Stack overflow!
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::overflow_error 'scopies were implementation-defined | they are the same as that of the original std::overflow_error object |