Namensräume
Varianten
Aktionen

std::optional

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)
optional
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
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 T oder einem anderen optional, 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 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.

(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) [edit]
zerstört den enthaltenen Wert, falls vorhanden
(public member function) [edit]
weist Inhalte zu
(public member function) [edit]
Iteratoren
(C++26)
gibt einen Iterator zum Anfang zurück
(public member function) [edit]
(C++26)
gibt einen Iterator zum Ende zurück
(public member function) [edit]
Observer
greift auf den enthaltenen Wert zu
(public member function) [edit]
prüft, ob das Objekt einen Wert enthält
(public member function) [edit]
gibt den enthaltenen Wert zurück
(public member function) [edit]
gibt den enthaltenen Wert zurück, falls vorhanden, sonst einen anderen Wert
(public member function) [edit]
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) [edit]
(C++23)
gibt ein optional zurück, das den transformierten enthaltenen Wert enthält, falls dieser existiert, andernfalls ein leeres optional
(public member function) [edit]
(C++23)
gibt das optional selbst zurück, wenn es einen Wert enthält, andernfalls das Ergebnis der gegebenen Funktion
(public member function) [edit]
Modifizierer
tauscht die Inhalte
(public member function) [edit]
zerstört jeden enthaltenen Wert
(public member function) [edit]
konstruiert den enthaltenen Wert in-place
(public member function) [edit]

[edit] Non-Member-Funktionen

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
vergleicht optional-Objekte
(function template) [edit]
erzeugt ein optional-Objekt
(function template) [edit]
spezialisiert den Algorithmus std::swap
(function template) [edit]

[edit] Hilfsklassen

Hash-Unterstützung für std::optional
(Klassentemplate-Spezialisierung) [bearbeiten]
(C++17)
Anzeiger für ein std::optional, das keinen Wert enthält
(class) [edit]
Ausnahme, die auf einen geprüften Zugriff auf ein optionales Element hinweist, das keinen Wert enthält
(class) [edit]

[edit] Hilfsmittel

(C++17)
ein Objekt vom Typ nullopt_t
(constant) [edit]
Tag für In-Place-Konstruktion
(tag)[edit]

[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) [bearbeiten]
(C++17)
Objekte, die Instanzen eines beliebigen CopyConstructible-Typs enthalten
(Klasse) [edit]
(C++23)
ein Wrapper, der entweder einen erwarteten oder einen Fehlerwert enthält
(Klassenvorlage) [edit]
eine view, die ein einzelnes Element eines bestimmten Wertes enthält
(class template) (customization point object)[edit]
eine leere view ohne Elemente
(class template) (variable template)[edit]