std::logic_error
| Definiert in der Header-Datei <stdexcept> |
||
| class logic_error; |
||
Definiert einen Typ von Objekten, die als Ausnahme geworfen werden. Es werden Fehler gemeldet, die aus fehlerhafter Logik innerhalb des Programms resultieren, wie z. B. die Verletzung logischer Vorbedingungen oder Klasseninvarianten, und die möglicherweise vermeidbar sind.
Keine Standardbibliothekskomponenten werfen diese Ausnahme direkt, aber die Ausnahme-Typen std::invalid_argument, std::domain_error, std::length_error, std::out_of_range, std::future_error und std::experimental::bad_optional_access sind von std::logic_error abgeleitet.
Vererbungdiagramm
Inhalt |
[bearbeiten] Memberfunktionen
| (Konstruktor) |
konstruiert ein neues logic_error-Objekt mit der gegebenen Meldung(öffentliche Memberfunktion) |
| operator= |
ersetzt das logic_error-Objekt(öffentliche Memberfunktion) |
std::logic_error::logic_error
| logic_error( const std::string& what_arg ); |
(1) | |
| logic_error( const char* what_arg ); |
(2) | |
| logic_error( const logic_error& other ); |
(3) | (noexcept seit C++11) |
std::logic_error haben, dann ist std::strcmp(what(), other.what()) == 0. Keine Ausnahme kann vom Kopierkonstruktor geworfen werden.Parameter
| what_arg | - | erklärende Zeichenkette |
| Sonstiges | - | ein anderes Ausnahmeobjekt zum Kopieren |
Ausnahmen
Anmerkungen
Da das Kopieren von std::logic_error keine Ausnahmen werfen darf, wird diese Meldung typischerweise intern als separat zugewiesener, referenzgezählter String gespeichert. Das ist auch der Grund, warum es keinen Konstruktor gibt, der std::string&& nimmt: Der Inhalt müsste ohnehin kopiert werden.
Vor der Auflösung von LWG-Problem 254 konnte der Nicht-Kopierkonstruktor nur std::string akzeptieren. Dies machte die dynamische Speicherzuweisung zur obligatorischen Erstellung eines std::string-Objekts.
Nach der Auflösung von LWG-Problem 471 muss eine abgeleitete Standard-Ausnahmeklasse einen öffentlich zugänglichen Kopierkonstruktor haben. Dieser kann implizit definiert werden, solange die durch what() erhaltenen erklärenden Zeichenketten für das ursprüngliche und das kopierte Objekt gleich sind.
std::logic_error::operator=
| logic_error& operator=( const logic_error& other ); |
(noexcept seit C++11) | |
Weist den Inhalt von other zu. Wenn *this und other beide den dynamischen Typ std::logic_error haben, dann ist std::strcmp(what(), other.what()) == 0 nach der Zuweisung. Keine Ausnahme kann vom Kopierzuweisungsoperator geworfen werden.
Parameter
| Sonstiges | - | ein anderes Ausnahmeobjekt zum Zuweisen |
Rückgabewert
*this
Anmerkungen
Nach der Auflösung von LWG-Problem 471 muss eine abgeleitete Standard-Ausnahmeklasse einen öffentlich zugänglichen Kopierzuweisungsoperator haben. Dieser kann implizit definiert werden, solange die durch what() erhaltenen erklärenden Zeichenketten für das ursprüngliche und das zugewiesene Objekt gleich sind.
Abgeleitet von std::exception
Memberfunktionen
| [virtuell] |
zerstört das Ausnahmeobjekt (virtuelle öffentliche Memberfunktion von std::exception) |
| [virtuell] |
gibt einen erklärenden String zurück (virtuelle öffentliche Memberfunktion von std::exception) |
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 254 | C++98 | Der Konstruktor, der const char* akzeptiert, fehlte | hinzugefügt |
| LWG 471 | C++98 | die erklärenden Zeichenketten von std::logic_errorKopien waren implementierungsabhängig |
sie sind identisch mit der des das ursprüngliche std::logic_error-Objekt |