Namespaces
Variants

std:: optional

From cppreference.net
Utilities library
Definiert im Header <optional>
template < class T >
class optional ;
(seit C++17)

Die Klassenvorlage std::optional verwaltet einen optionalen enthaltenen Wert, d.h. einen Wert, der vorhanden sein kann oder nicht.

Ein häufiger Anwendungsfall für optional ist der Rückgabewert einer Funktion, die fehlschlagen kann. Im Gegensatz zu anderen Ansätzen, wie std:: pair < T, bool > , optional behandelt aufwändig zu konstruierende Objekte gut und ist lesbarer, da die Absicht explizit ausgedrückt wird.

Jede Instanz von optional enthält zu jedem gegebenen Zeitpunkt entweder einen Wert oder enthält keinen Wert .

Wenn ein optional einen Wert enthält, ist garantiert, dass der Wert innerhalb des optional -Objekts geschachtelt ist. Daher modelliert ein optional -Objekt ein Objekt, nicht einen Zeiger, obwohl operator*() und operator->() definiert sind.

Wenn ein Objekt vom Typ optional<T> kontextuell zu bool konvertiert wird , gibt die Konvertierung true zurück, wenn das Objekt einen Wert enthält, und false , wenn es keinen Wert enthält.

Das optional -Objekt enthält einen Wert unter folgenden Bedingungen:

  • Das Objekt wird mit einem Wert vom Typ T oder einem anderen optional initialisiert/zugewiesen, das einen Wert enthält.

Das Objekt enthält in den folgenden Fällen keinen Wert:

  • Das Objekt wird standardmäßig initialisiert.
  • Das Objekt wird mit einem Wert vom Typ std::nullopt_t initialisiert oder von einem optional -Objekt, das keinen Wert enthält, zugewiesen.
  • Die Memberfunktion reset() wird aufgerufen.

Das optional -Objekt ist eine view , die entweder ein Element enthält, wenn es einen Wert enthält , oder andernfalls null Elemente, wenn es keinen Wert enthält. Die Lebensdauer des enthaltenen Elements ist an das Objekt gebunden.

(since C++26)

Es gibt keine optionalen Referenzen, Funktionen, Arrays oder (möglicherweise cv-qualifizierte) void ; ein Programm ist fehlerhaft, wenn es ein optional mit einem solchen Typ instanziiert. Zusätzlich ist ein Programm fehlerhaft, wenn es ein optional mit den (möglicherweise cv-qualifizierten) Tag-Typen std::nullopt_t oder std::in_place_t instanziiert.

Inhaltsverzeichnis

Template-Parameter

T - der Typ des Werts, für den der Initialisierungszustand verwaltet werden soll. Der Typ muss die Anforderungen von Destructible erfüllen (insbesondere sind Array- und Referenztypen nicht erlaubt).

Verschachtelte Typen

Typ Definition
value_type T
iterator (seit C++26) implementierungsdefiniert LegacyRandomAccessIterator , ConstexprIterator und contiguous_iterator , dessen value_type und reference jeweils std:: remove_cv_t < T > und T & sind.
const_iterator (seit C++26) implementierungsdefiniert LegacyRandomAccessIterator , ConstexprIterator und contiguous_iterator , dessen value_type und reference jeweils std:: remove_cv_t < T > und const T & sind.

Alle Anforderungen an die Iteratortypen eines Container gelten ebenfalls für den iterator -Typ von optional .

Datenmitglieder

T* val ein Zeiger auf das enthaltene Objekt (falls vorhanden)
( Nur zur Darstellung verwendetes Mitgliedsobjekt* )

Memberfunktionen

konstruiert das optional -Objekt
(öffentliche Elementfunktion)
zerstört den enthaltenen Wert, falls vorhanden
(öffentliche Elementfunktion)
weist Inhalte zu
(öffentliche Elementfunktion)
Iteratoren
(C++26)
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
(C++26)
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion)
Beobachter
greift auf den enthaltenen Wert zu
(öffentliche Elementfunktion)
prüft, ob das Objekt einen Wert enthält
(öffentliche Elementfunktion)
gibt den enthaltenen Wert zurück
(öffentliche Elementfunktion)
gibt den enthaltenen Wert zurück, falls verfügbar, andernfalls einen anderen Wert
(öffentliche Elementfunktion)
Monadische Operationen
(C++23)
gibt das Ergebnis der gegebenen Funktion auf dem enthaltenen Wert zurück, falls vorhanden, oder ein leeres optional andernfalls
(öffentliche Elementfunktion)
(C++23)
gibt ein optional mit dem transformierten enthaltenen Wert zurück, falls vorhanden, oder ein leeres optional andernfalls
(öffentliche Elementfunktion)
(C++23)
gibt das optional selbst zurück, falls es einen Wert enthält, oder das Ergebnis der gegebenen Funktion andernfalls
(öffentliche Elementfunktion)
Modifikatoren
tauscht die Inhalte aus
(öffentliche Elementfunktion)
zerstört jeden enthaltenen Wert
(öffentliche Elementfunktion)
konstruiert den enthaltenen Wert direkt
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

(C++17) (C++17) (C++17) (C++17) (C++17) (C++17) (C++20)
vergleicht optional -Objekte
(Funktions-Template)
erstellt ein optional -Objekt
(Funktions-Template)
spezialisiert den std::swap -Algorithmus
(Funktions-Template)

Hilfsklassen

Hash-Unterstützung für std::optional
(Klassen-Template-Spezialisierung)
(C++17)
Indikator für ein std::optional , das keinen Wert enthält
(Klasse)
Ausnahme, die einen geprüften Zugriff auf ein optionales Objekt ohne Wert anzeigt
(Klasse)

Helfer

(C++17)
ein Objekt vom Typ nullopt_t
(Konstante)
In-place-Konstruktions-Tag
(Tag)

Helfer-Spezialisierungen

template < class T >
constexpr bool ranges:: enable_view < std :: optional < T >> = true ;
(seit C++26)

Diese Spezialisierung von ranges::enable_view bewirkt, dass optional die Anforderungen von view erfüllt.

template < class T >
constexpr auto format_kind < std :: optional < T >> = range_format :: disabled ;
(seit C++26)

Diese Spezialisierung von format_kind deaktiviert die Bereichsformatierungsunterstützung von optional .

Ableitungsleitfäden

Hinweise

Feature-Test Makro Wert Std Feature
__cpp_lib_optional 201606L (C++17) std::optional
202106L (C++23)
(DR20)
Vollständig constexpr
202110L (C++23) Monadische Operationen
__cpp_lib_optional_range_support 202406L (C++26) Bereichsunterstützung für std::optional

Beispiel

#include <iostream>
#include <optional>
#include <string>
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    return {};
}
// std::nullopt can be used to create any (empty) std::optional
auto create2(bool b)
{
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
    // optional-returning factory functions are usable as conditions of while and if
    if (auto str = create2(true))
        std::cout << "create2(true) returned " << *str << '\n';
}

Ausgabe:

create(false) returned empty
create2(true) returned Godzilla

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 4141 C++17 die Anforderung der Speicher-
reservierung war verwirrend
das enthaltene Objekt muss
innerhalb des optional -Objekts
geschachtelt sein

Siehe auch

(C++17)
eine typsichere diskriminierte Union
(Klassen-Template)
(C++17)
Objekte, die Instanzen eines beliebigen CopyConstructible Typs halten
(Klasse)
(C++23)
ein Wrapper, der entweder einen erwarteten oder einen Fehlerwert enthält
(Klassen-Template)
eine view , die ein einzelnes Element eines bestimmten Wertes enthält
(Klassen-Template) (Anpassungspunkt-Objekt)
eine leere view ohne Elemente
(Klassen-Template) (Variablen-Template)