Namensräume
Varianten
Aktionen

std::expected

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)  
(C++20)
Swap und Typ-Operationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gemeinsame Vokabulartypen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
expected
(C++23)



 
 
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>

class expected<T, E>;
(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) [bearbeiten]
zerstört das expected-Objekt zusammen mit seinem enthaltenen Wert
(öffentliche Mitgliedsfunktion) [bearbeiten]
weist Inhalte zu
(öffentliche Mitgliedsfunktion) [bearbeiten]
Observer
greift auf den erwarteten Wert zu
(öffentliche Mitgliedsfunktion) [bearbeiten]
prüft, ob das Objekt einen erwarteten Wert enthält
(öffentliche Mitgliedsfunktion) [bearbeiten]
gibt den erwarteten Wert zurück
(öffentliche Mitgliedsfunktion) [bearbeiten]
gibt den unerwarteten Wert zurück
(öffentliche Mitgliedsfunktion) [bearbeiten]
gibt den erwarteten Wert zurück, falls vorhanden, andernfalls einen anderen Wert
(öffentliche Mitgliedsfunktion) [bearbeiten]
gibt den unerwarteten Wert zurück, falls vorhanden, andernfalls einen anderen Wert
(öffentliche Mitgliedsfunktion) [bearbeiten]
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) [bearbeiten]
gibt ein expected mit dem transformierten erwarteten Wert zurück, falls dieser existiert; andernfalls gibt es das expected selbst zurück
(öffentliche Mitgliedsfunktion) [bearbeiten]
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) [bearbeiten]
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) [bearbeiten]
Modifizierer
konstruiert den erwarteten Wert an Ort und Stelle
(öffentliche Mitgliedsfunktion) [bearbeiten]
tauscht die Inhalte
(öffentliche Mitgliedsfunktion) [bearbeiten]

[edit] Nicht-Mitgliedsfunktionen

vergleicht expected-Objekte
(Funktionsschablone) [bearbeiten]
spezialisiert den Algorithmus std::swap
(Funktion) [bearbeiten]

[edit] Hilfsklassen

als unerwarteter Wert dargestellt
(Klassenschablone) [bearbeiten]
Ausnahme, die den geprüften Zugriff auf ein expected anzeigt, das einen unerwarteten Wert enthält
(Klassenschablone) [bearbeiten]
Tag für die In-Place-Konstruktion eines unerwarteten Wertes in expected
(Tag)[bearbeiten]

[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

#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) [bearbeiten]
(C++17)
ein Wrapper, der möglicherweise ein Objekt enthält oder auch nicht
(Klassenvorlage) [edit]