Namespaces
Variants

std:: expected

From cppreference.net
Utilities library
Definiert im Header <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 Klassenvorlage std::expected bietet eine Möglichkeit, einen von zwei Werten darzustellen: einen erwarteten Wert vom Typ T oder einen unerwarteten Wert vom Typ E . expected ist niemals wertlos.

1) Die Hauptvorlage. Enthält den erwarteten oder unerwarteten Wert innerhalb ihres eigenen Speichers, der innerhalb des expected -Objekts verschachtelt ist.
2) Die void -Partialspezialisierung. Repräsentiert einen erwarteten void -Wert oder enthält einen unerwarteten Wert. Wenn es einen unerwarteten Wert enthält, ist dieser innerhalb des expected -Objekts verschachtelt.

Ein Programm ist fehlerhaft, 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.

Inhaltsverzeichnis

Template-Parameter

T - der Typ des erwarteten Werts. 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 Werts. Der Typ muss die Destructible -Anforderungen erfüllen und muss ein gültiges Template-Argument für std::unexpected sein (insbesondere sind Arrays, Nicht-Objekt-Typen und cv-qualifizierte Typen nicht erlaubt).

Verschachtelte Typen

Typ Definition
value_type T
error_type E
unexpected_type std::unexpected<E>

Member-Templates

Vorlage Definition
rebind < U > std :: expected < U, error_type >

Datenmitglieder

Mitglied Beschreibung
bool has_val ob das expected Objekt aktuell den erwarteten Wert repräsentiert
( Nur zur Veranschaulichung dienendes Mitgliedsobjekt* )
T val (nur Haupttemplate) der erwartete Wert
( Nur zur Veranschaulichung dienendes Varianten-Mitgliedsobjekt* )
E unex der unerwartete Wert
( Nur zur Veranschaulichung dienendes Varianten-Mitgliedsobjekt* )

Memberfunktionen

konstruiert das expected Objekt
(öffentliche Elementfunktion)
zerstört das expected Objekt zusammen mit seinem enthaltenen Wert
(öffentliche Elementfunktion)
weist Inhalte zu
(öffentliche Elementfunktion)
Beobachter
greift auf den erwarteten Wert zu
(öffentliche Elementfunktion)
prüft, ob das Objekt einen erwarteten Wert enthält
(öffentliche Elementfunktion)
gibt den erwarteten Wert zurück
(öffentliche Elementfunktion)
gibt den unerwarteten Wert zurück
(öffentliche Elementfunktion)
gibt den erwarteten Wert zurück, falls vorhanden, andernfalls einen anderen Wert
(öffentliche Elementfunktion)
gibt den unerwarteten Wert zurück, falls vorhanden, andernfalls einen anderen Wert
(öffentliche Elementfunktion)
Monadische Operationen
gibt das Ergebnis der gegebenen Funktion auf den erwarteten Wert zurück, falls vorhanden; andernfalls gibt es das expected selbst zurück
(öffentliche Elementfunktion)
gibt ein expected zurück, das den transformierten erwarteten Wert enthält, falls vorhanden; andernfalls gibt es das expected selbst zurück
(öffentliche Elementfunktion)
gibt das expected selbst zurück, falls es einen erwarteten Wert enthält; andernfalls gibt es das Ergebnis der gegebenen Funktion auf den unerwarteten Wert zurück
(öffentliche Elementfunktion)
gibt das expected selbst zurück, falls es einen erwarteten Wert enthält; andernfalls gibt es ein expected zurück, das den transformierten unerwarteten Wert enthält
(öffentliche Elementfunktion)
Modifikatoren
konstruiert den erwarteten Wert direkt
(öffentliche Elementfunktion)
tauscht die Inhalte aus
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

(C++23)
vergleicht expected -Objekte
(Funktionsschablone)
spezialisiert den std::swap -Algorithmus
(Funktion)

Hilfsklassen

(C++23)
dargestellt als ein unerwarteter Wert
(Klassentemplate)
Exception, die geprüften Zugriff auf ein expected anzeigt, das einen unerwarteten Wert enthält
(Klassentemplate)
In-place-Konstruktions-Tag für unerwarteten Wert in expected
(Tag)

Hinweise

Typen mit der gleichen Funktionalität werden Result in Rust und Either in Haskell genannt.

Feature-Test Makro Wert Std Funktion
__cpp_lib_expected 202202L (C++23) Klassentemplate std::expected und zugehörige Hilfsklassen
202211L (C++23) Monadische Funktionen für std::expected

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';
            // Wenn num keinen Wert hätte, würde das Dereferenzieren von num
            // zu undefiniertem Verhalten führen, und
            // num.value() würde std::bad_expected_access werfen.
            // num.value_or(123) verwendet den angegebenen Standardwert 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"; // oder std::unreachable() aufrufen;
    };
    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

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 der Speicher-
reservierung war verwirrend
das enthaltene Objekt muss
innerhalb des expected -Objekts
geschachtelt sein

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 22.8 Expected-Objekte [expected]

Siehe auch

(C++17)
Eine typsichere diskriminierte Union
(Klassentemplate)
(C++17)
Ein Wrapper, der möglicherweise ein Objekt enthält
(Klassentemplate)