std:: optional
|
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
Toder einem anderenoptionalinitialisiert/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
|
(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) |
|
(C++17)
|
erstellt ein
optional
-Objekt
(Funktions-Template) |
|
(C++17)
|
spezialisiert den
std::swap
-Algorithmus
(Funktions-Template) |
Hilfsklassen
|
(C++17)
|
Hash-Unterstützung für
std::optional
(Klassen-Template-Spezialisierung) |
|
(C++17)
|
Indikator für ein
std::optional
, das keinen Wert enthält
(Klasse) |
|
(C++17)
|
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) |
|
|
(C++20)
|
eine leere
view
ohne Elemente
(Klassen-Template) (Variablen-Template) |