std:: overflow_error
|
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
|
(seit C++26) |
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) |
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
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:: runtime_error
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
|