std::expected
Von cppreference.com
| Definiert in der Header-Datei <expected> |
||
| template< class T, class E > class expected; |
(1) | (seit C++23) |
| template< class T, class E > requires std::is_void_v<T> |
(2) | (seit C++23) |
Die Klassenschablone std::expected bietet eine Möglichkeit, entweder einen von zwei Werten darzustellen: einen *erwarteten* Wert vom Typ T oder einen *unerwarteten* Wert vom Typ E. expected ist niemals wertlos.
1) Die Hauptschablone. Enthält den erwarteten oder unerwarteten Wert innerhalb ihres eigenen Speichers, der sich innerhalb des
expected-Objekts befindet.2) Die partielle Spezialisierung für void. Repräsentiert einen erwarteten void-Wert oder enthält einen unerwarteten Wert. Wenn sie einen unerwarteten Wert enthält, ist dieser im
expected-Objekt verschachtelt.Ein Programm ist schlecht geformt, wenn es ein expected mit einem Referenztyp, einem Funktionstyp oder einer Spezialisierung von std::unexpected instanziiert. Zusätzlich darf T nicht std::in_place_t oder std::unexpect_t sein.
Inhalt |
[edit] Template-Parameter
| T | - | der Typ des erwarteten Wertes. Der Typ muss entweder (möglicherweise cv-qualifiziert) void sein oder die Destructible-Anforderungen erfüllen (insbesondere sind Array- und Referenztypen nicht erlaubt). |
| E | - | der Typ des unerwarteten Wertes. Der Typ muss die Destructible-Anforderungen erfüllen und ein gültiges Argument für die Schablone std::unexpected sein (insbesondere sind Arrays, Nicht-Objekttypen und cv-qualifizierte Typen nicht erlaubt). |
[edit] Mitgliedstypen
| Mitgliedertyp | Definition |
value_type
|
T
|
error_type
|
E
|
unexpected_type
|
std::unexpected<E>
|
[edit] Mitglieds-Alias-Schablonen
| Typ | Definition |
| rebind<U> | std::expected<U, error_type> |
[edit] Datenelemente
| Mitglied | Definition |
bool has_val |
ob, ob das expected-Objekt derzeit den erwarteten Wert repräsentiert((exposition-only member object*) |
T val (nur Hauptschablone) |
der erwartete Wert ((nur exposition-Variantenmitgliedsobjekt*) |
E unex |
der unerwartete Wert ((nur exposition-Variantenmitgliedsobjekt*) |
[edit] Mitgliedsfunktionen
konstruiert das expected-Objekt(öffentliche Mitgliedsfunktion) | |
zerstört das expected-Objekt zusammen mit seinem enthaltenen Wert(öffentliche Mitgliedsfunktion) | |
| weist Inhalte zu (öffentliche Mitgliedsfunktion) | |
Observer | |
| greift auf den erwarteten Wert zu (öffentliche Mitgliedsfunktion) | |
| prüft, ob das Objekt einen erwarteten Wert enthält (öffentliche Mitgliedsfunktion) | |
| gibt den erwarteten Wert zurück (öffentliche Mitgliedsfunktion) | |
| gibt den unerwarteten Wert zurück (öffentliche Mitgliedsfunktion) | |
| gibt den erwarteten Wert zurück, falls vorhanden, andernfalls einen anderen Wert (öffentliche Mitgliedsfunktion) | |
| gibt den unerwarteten Wert zurück, falls vorhanden, andernfalls einen anderen Wert (öffentliche Mitgliedsfunktion) | |
Monadische Operationen | |
gibt das Ergebnis der gegebenen Funktion auf dem erwarteten Wert zurück, falls dieser existiert; andernfalls gibt es das expected selbst zurück(öffentliche Mitgliedsfunktion) | |
gibt ein expected mit dem transformierten erwarteten Wert zurück, falls dieser existiert; andernfalls gibt es das expected selbst zurück(öffentliche Mitgliedsfunktion) | |
gibt das expected selbst zurück, wenn es einen erwarteten Wert enthält; andernfalls gibt es das Ergebnis der gegebenen Funktion auf dem unerwarteten Wert zurück(öffentliche Mitgliedsfunktion) | |
gibt das expected selbst zurück, wenn es einen erwarteten Wert enthält; andernfalls gibt es ein expected mit dem transformierten unerwarteten Wert zurück(öffentliche Mitgliedsfunktion) | |
Modifizierer | |
| konstruiert den erwarteten Wert an Ort und Stelle (öffentliche Mitgliedsfunktion) | |
| tauscht die Inhalte (öffentliche Mitgliedsfunktion) | |
[edit] Nicht-Mitgliedsfunktionen
| (C++23) |
vergleicht expected-Objekte(Funktionsschablone) |
| (C++23) |
spezialisiert den Algorithmus std::swap (Funktion) |
[edit] Hilfsklassen
| (C++23) |
als unerwarteter Wert dargestellt (Klassenschablone) |
| (C++23) |
Ausnahme, die den geprüften Zugriff auf ein expected anzeigt, das einen unerwarteten Wert enthält(Klassenschablone) |
| (C++23) |
Tag für die In-Place-Konstruktion eines unerwarteten Wertes in expected(Tag) |
[edit] Anmerkungen
Typen mit derselben Funktionalität werden in Rust als Result und in Haskell als Either bezeichnet.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_expected |
202202L |
(C++23) | Klassenschablone std::expected und zugehörige Hilfsklassen |
202211L |
(C++23) | Monadische Funktionen für std::expected |
[edit] Beispiel
Führen Sie diesen Code aus
#include <cmath> #include <expected> #include <iomanip> #include <iostream> #include <string_view> enum class parse_error { invalid_input, overflow }; auto parse_number(std::string_view& str) -> std::expected<double, parse_error> { const char* begin = str.data(); char* end; double retval = std::strtod(begin, &end); if (begin == end) return std::unexpected(parse_error::invalid_input); else if (std::isinf(retval)) return std::unexpected(parse_error::overflow); str.remove_prefix(end - begin); return retval; } int main() { auto process = [](std::string_view str) { std::cout << "str: " << std::quoted(str) << ", "; if (const auto num = parse_number(str); num.has_value()) std::cout << "value: " << *num << '\n'; // If num did not have a value, dereferencing num // would cause an undefined behavior, and // num.value() would throw std::bad_expected_access. // num.value_or(123) uses specified default value 123. else if (num.error() == parse_error::invalid_input) std::cout << "error: invalid input\n"; else if (num.error() == parse_error::overflow) std::cout << "error: overflow\n"; else std::cout << "unexpected!\n"; // or invoke std::unreachable(); }; for (auto src : {"42", "42abc", "meow", "inf"}) process(src); }
Ausgabe
str: "42", value: 42 str: "42abc", value: 42 str: "meow", error: invalid input str: "inf", error: overflow
[edit] 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 4141 | C++23 | die Anforderung an Speicher Allokation war verwirrend |
Das enthaltene Objekt muss innerhalb des expected-Objekts verschachtelt |
[edit] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 22.8 Expected objects [expected]
[edit] Siehe auch
| (C++17) |
eine typsichere diskriminierte Union (Klassentemplate) |
| (C++17) |
ein Wrapper, der möglicherweise ein Objekt enthält oder auch nicht (Klassenvorlage) |