std::optional
| Definiert in der Header-Datei <optional> |
||
| template< class T > class optional; |
(seit C++17) | |
Die Klassenschablone std::optional verwaltet einen optionalen enthaltenen Wert, d.h. einen Wert, der vorhanden sein kann oder auch nicht.
Ein häufiger Anwendungsfall für optional ist der Rückgabewert einer Funktion, die fehlschlagen kann. Im Gegensatz zu anderen Ansätzen, wie z.B. std::pair<T, bool>, behandelt optional teure zu konstruierende Objekte gut und ist lesbarer, da die Absicht explizit ausgedrückt wird.
Jede Instanz von optional enthält zu jedem Zeitpunkt entweder einen Wert oder keinen Wert.
Wenn ein optional einen Wert enthält, ist garantiert, dass der Wert innerhalb des optional-Objekts verschachtelt ist. Somit modelliert ein optional-Objekt ein Objekt und keinen Zeiger, auch wenn operator*() und operator->() definiert sind.
Wenn ein Objekt vom Typ optional<T> kontextbezogen in bool umgewandelt 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 unter folgenden Bedingungen einen Wert:
- Das Objekt wird mit/aus einem Wert vom Typ
Toder einem anderenoptional, das einen Wert enthält, initialisiert/zugewiesen.
Das Objekt enthält unter folgenden Bedingungen keinen Wert:
- Das Objekt wird default-initialisiert.
- Das Objekt wird mit/aus einem Wert vom Typ std::nullopt_t oder einem
optional-Objekt, das keinen Wert enthält, initialisiert/zugewiesen. - Die Memberfunktion reset() wird aufgerufen.
|
Das |
(seit C++26) |
Es gibt keine optionalen Referenzen, Funktionen, Arrays oder (möglicherweise cv-qualifiziertes) void; ein Programm ist ill-formed, wenn es ein optional mit einem solchen Typ instanziiert. Darüber hinaus ist ein Programm ill-formed, wenn es ein optional mit den (möglicherweise cv-qualifizierten) Tag-Typen std::nullopt_t oder std::in_place_t instanziiert.
Inhalt |
[edit] Template-Parameter
| T | - | der Typ des zu verwaltenden Werts für den Initialisierungszustand. Der Typ muss die Anforderungen von Destructible erfüllen (insbesondere sind Array- und Referenztypen nicht erlaubt). |
[edit] Verschachtelte Typen
| Typ | Definition |
value_type
|
T
|
iterator (seit C++26) |
implementierungsabhängiger LegacyRandomAccessIterator, ConstexprIterator und contiguous_iterator, deren value_type und reference std::remove_cv_t<T> bzw. T& sind. |
const_iterator (seit C++26) |
implementierungsabhängiger LegacyRandomAccessIterator, ConstexprIterator und contiguous_iterator, deren value_type und reference std::remove_cv_t<T> bzw. const T& sind. |
Alle Anforderungen an die Iteratortypen eines Containers gelten auch für den iterator-Typ von optional.
[edit] Datenmember
T* val |
ein Zeiger auf das enthaltene Objekt (falls vorhanden) ((exposition-only member object*) |
[edit] Memberfunktionen
konstruiert das optional-Objekt(public member function) | |
| zerstört den enthaltenen Wert, falls vorhanden (public member function) | |
| weist Inhalte zu (public member function) | |
Iteratoren | |
| (C++26) |
gibt einen Iterator zum Anfang zurück (public member function) |
| (C++26) |
gibt einen Iterator zum Ende zurück (public member function) |
Observer | |
| greift auf den enthaltenen Wert zu (public member function) | |
| prüft, ob das Objekt einen Wert enthält (public member function) | |
| gibt den enthaltenen Wert zurück (public member function) | |
| gibt den enthaltenen Wert zurück, falls vorhanden, sonst einen anderen Wert (public member function) | |
Monadische Operationen | |
| (C++23) |
gibt das Ergebnis der gegebenen Funktion auf dem enthaltenen Wert zurück, falls dieser existiert, andernfalls ein leeres optional(public member function) |
| (C++23) |
gibt ein optional zurück, das den transformierten enthaltenen Wert enthält, falls dieser existiert, andernfalls ein leeres optional(public member function) |
| (C++23) |
gibt das optional selbst zurück, wenn es einen Wert enthält, andernfalls das Ergebnis der gegebenen Funktion(public member function) |
Modifizierer | |
| tauscht die Inhalte (public member function) | |
| zerstört jeden enthaltenen Wert (public member function) | |
| konstruiert den enthaltenen Wert in-place (public member function) | |
[edit] Non-Member-Funktionen
| (C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) |
vergleicht optional-Objekte(function template) |
| (C++17) |
erzeugt ein optional-Objekt(function template) |
| (C++17) |
spezialisiert den Algorithmus std::swap (function template) |
[edit] Hilfsklassen
| (C++17) |
Hash-Unterstützung für std::optional (Klassentemplate-Spezialisierung) |
| (C++17) |
Anzeiger für ein std::optional, das keinen Wert enthält(class) |
| (C++17) |
Ausnahme, die auf einen geprüften Zugriff auf ein optionales Element hinweist, das keinen Wert enthält (class) |
[edit] Hilfsmittel
| (C++17) |
ein Objekt vom Typ nullopt_t(constant) |
| Tag für In-Place-Konstruktion (tag) |
[edit] Hilfsspezialisierungen
| template< class T > constexpr bool ranges::enable_view<std::optional<T>> = true; |
(seit C++26) | |
Diese Spezialisierung von ranges::enable_view lässt optional view erfüllen.
| 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.
[edit] Deduction Guides
[edit] 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 |
[edit] 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
[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++17 | Die Anforderung an die Speicherung Allokation war verwirrend |
Das enthaltene Objekt muss innerhalb des optional-Objekts verschachtelt sein |
[edit] Siehe auch
| (C++17) |
eine typsichere diskriminierte Union (Klassentemplate) |
| (C++17) |
Objekte, die Instanzen eines beliebigen CopyConstructible-Typs enthalten (Klasse) |
| (C++23) |
ein Wrapper, der entweder einen erwarteten oder einen Fehlerwert enthält (Klassenvorlage) |
eine view, die ein einzelnes Element eines bestimmten Wertes enthält(class template) (customization point object) | |
eine leere view ohne Elemente(class template) (variable template) |