Namespaces
Variants

std:: overflow_error

From cppreference.net
Definiert im Header <stdexcept>
class overflow_error ;

Definiert eine Art von Objekt, das als Exception geworfen wird. Es kann verwendet werden, um Arithmetik-Überlauffehler zu melden (das heißt Situationen, in denen ein Berechnungsergebnis für den Zieltyp zu groß ist).

Die einzige Standardbibliothek-Komponente, die diese Ausnahme wirft, ist std::bitset::to_ulong .

(bis C++11)

Die einzigen Standardbibliothek-Komponenten, die diese Ausnahme werfen, sind std::bitset::to_ulong und std::bitset::to_ullong .

(seit C++11)

Die mathematischen Funktionen der Standardbibliothek-Komponenten werfen diese Ausnahme nicht (mathematische Funktionen melden Überlauffehler wie in math_errhandling spezifiziert). Drittanbieter-Bibliotheken verwenden diese jedoch. Zum Beispiel wirft boost.math std::overflow_error wenn boost::math::policies::throw_on_error aktiviert ist (die Standardeinstellung).

Alle Memberfunktionen von std::overflow_error sind constexpr : Es ist möglich, std::overflow_error -Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.

Allerdings können std::overflow_error -Objekte im Allgemeinen nicht constexpr sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.

(seit C++26)
cpp/error/exception cpp/error/runtime error std-overflow error-inheritance.svg

Vererbungsdiagramm

Inhaltsverzeichnis

Memberfunktionen

(Konstruktor)
konstruiert ein neues overflow_error Objekt mit der gegebenen Nachricht
(öffentliche Member-Funktion)
operator=
ersetzt das overflow_error Objekt
(öffentliche Member-Funktion)

std::overflow_error:: overflow_error

overflow_error ( const std:: string & what_arg ) ;
(1) (constexpr seit C++26)
overflow_error ( const char * what_arg ) ;
(2) (constexpr seit C++26)
overflow_error ( const overflow_error & other ) ;
(3) (noexcept seit C++11)
(constexpr seit C++26)
1) Konstruiert das Ausnahmeobjekt mit what_arg als erklärendem String. Nach der Konstruktion gilt std:: strcmp ( what ( ) , what_arg. c_str ( ) ) == 0 .
2) Konstruiert das Ausnahmeobjekt mit what_arg als erklärendem String. Nach der Konstruktion gilt std:: strcmp ( what ( ) , what_arg ) == 0 .
3) Kopierkonstruktor. Wenn * this und other beide den dynamischen Typ std::overflow_error haben, dann gilt std:: strcmp ( what ( ) , other. what ( ) ) == 0 . Vom Kopierkonstruktor können keine Ausnahmen geworfen werden.

Parameter

what_arg - erklärender String
other - ein anderes Ausnahmeobjekt zum Kopieren

Ausnahmen

1,2) Kann std::bad_alloc werfen.

Anmerkungen

Da das Kopieren von std::overflow_error keine Ausnahmen werfen darf, wird diese Nachricht typischerweise intern als separat allokierter referenzgezählter String gespeichert. Dies ist auch der Grund, warum es keinen Konstruktor gibt, der std::string&& akzeptiert: Der Inhalt müsste ohnehin kopiert werden.

Vor der Lösung von LWG Issue 254 konnte der Nicht-Kopier-Konstruktor nur std::string akzeptieren. Dies machte dynamische Allokation zwingend erforderlich, um ein std::string -Objekt zu konstruieren.

Nach der Lösung von LWG Issue 471 muss eine abgeleitete Standard-Ausnahmeklasse einen öffentlich zugänglichen Kopierkonstruktor haben. Er kann implizit definiert werden, solange die durch what() erhaltenen erklärenden Strings für das ursprüngliche Objekt und das kopierte Objekt identisch sind.

std::overflow_error:: operator=

overflow_error & operator = ( const overflow_error & other ) ;
(noexcept seit C++11)
(constexpr seit C++26)

Weist die Inhalte mit denen von other zu. Wenn * this und other beide den dynamischen Typ std::overflow_error haben, dann gilt std:: strcmp ( what ( ) , other. what ( ) ) == 0 nach der Zuweisung. Vom Kopierzuweisungsoperator kann keine Exception ausgelöst werden.

Parameter

other - ein weiteres Exception-Objekt, mit dem zugewiesen wird

Rückgabewert

* this

Anmerkungen

Nach der Lösung von LWG Issue 471 muss eine abgeleitete Standard-Exception-Klasse einen öffentlich zugänglichen Kopierzuweisungsoperator haben. Er kann implizit definiert werden, solange die erklärenden Zeichenketten, die durch what() erhalten werden, für das ursprüngliche Objekt und das kopierte Objekt gleich sind.

Geerbt von std:: exception

Elementfunktionen

[virtual]
zerstört das Exception-Objekt
(virtuelle öffentliche Elementfunktion von std::exception )
[virtual]
gibt einen erläuternden String zurück
(virtuelle öffentliche Elementfunktion von std::exception )

Hinweise

Feature-Test Makro Wert Std Feature
__cpp_lib_constexpr_exceptions 202502L (C++26) constexpr Ausnahmetypen

Beispiel

#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())
            throw std::underflow_error("Stack underflow!");
        --top_;
    }
    T const& 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_error const& ex)
    {
        std::cout << "1) Exception: " << ex.what() << '\n';
    }
    st.push(1337);
    while (!st.empty())
    	st.pop();
    try
    {
        st.pop();
    }
    catch (std::underflow_error const& ex)
    {
        std::cout << "2) Exception: " << ex.what() << '\n';
    }
    try
    {
        for (int i{}; i != 13; ++i)
            st.push(i);
    }
    catch (std::overflow_error const& ex)
    {
        std::cout << "3) Exception: " << ex.what() << '\n';
    }
}

Ausgabe:

1) Exception: Stack is empty!
2) Exception: Stack underflow!
3) Exception: Stack overflow!

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 254 C++98 der Konstruktor mit const char * fehlte hinzugefügt
LWG 471 C++98 die erklärenden Zeichenketten der Kopien von std::overflow_error
waren implementierungsdefiniert
sie sind identisch mit denen des
ursprünglichen std::overflow_error -Objekts