std:: optional
|
Défini dans l'en-tête
<optional>
|
||
|
template
<
class
T
>
class optional ; |
(depuis C++17) | |
Le modèle de classe
std::optional
gère une valeur contenue optionnelle, c'est-à-dire une valeur qui peut être présente ou non.
Un cas d'utilisation courant pour
optional
est la valeur de retour d'une fonction qui peut échouer. Contrairement à d'autres approches, telles que
std::
pair
<
T,
bool
>
,
optional
gère bien les objets coûteux à construire et est plus lisible, car l'intention est exprimée explicitement.
Toute instance de
optional
à un moment donné soit
contient une valeur
soit
ne contient pas de valeur
.
Si un
optional
contient une valeur, il est garanti que la valeur est
imbriquée à l'intérieur
de l'objet
optional
. Ainsi, un objet
optional
modélise un objet, et non un pointeur, même si
operator*()
et
operator->()
sont définis.
Lorsqu'un objet de type
optional<T>
est
contextuellement converti en
bool
, la conversion retourne
true
si l'objet contient une valeur et
false
s'il ne contient pas de valeur.
L'objet
optional
contient une valeur dans les conditions suivantes :
-
L'objet est initialisé avec/assigné à partir d'une valeur de type
Tou d'un autreoptionalqui contient une valeur.
L'objet ne contient pas de valeur dans les conditions suivantes :
- L'objet est initialisé par défaut.
-
L'objet est initialisé avec/assigné à partir d'une valeur de type
std::nullopt_t
ou d'un objet
optionalqui ne contient pas de valeur. - La fonction membre reset() est appelée.
|
L'objet
|
(since C++26) |
Il n'y a pas de références optionnelles, de fonctions, de tableaux ou de types
void
(éventuellement qualifiés cv) ; un programme est mal formé s'il instancie un
optional
avec un tel type. De plus, un programme est mal formé s'il instancie un
optional
avec les types de balises (éventuellement qualifiés cv)
std::nullopt_t
ou
std::in_place_t
.
Table des matières |
Paramètres du modèle
| T | - | le type de la valeur pour laquelle gérer l'état d'initialisation. Le type doit satisfaire aux exigences de Destructible (en particulier, les types tableau et référence ne sont pas autorisés). |
Types imbriqués
| Type | Définition |
value_type
|
T
|
iterator
(depuis C++26)
|
défini par l'implémentation
LegacyRandomAccessIterator
,
ConstexprIterator
, et
contiguous_iterator
dont le
value_type
et le
reference
sont
std::
remove_cv_t
<
T
>
et
T
&
, respectivement.
|
const_iterator
(depuis C++26)
|
défini par l'implémentation
LegacyRandomAccessIterator
,
ConstexprIterator
, et
contiguous_iterator
dont le
value_type
et le
reference
sont
std::
remove_cv_t
<
T
>
et
const
T
&
, respectivement.
|
Toutes les exigences relatives aux types d'itérateurs d'un
Container
s'appliquent également au type
iterator
de
optional
.
Membres de données
T*
val
|
un pointeur vers l'objet contenu (s'il existe)
( objet membre d'exposition uniquement* ) |
Fonctions membres
construit l'objet
optional
(fonction membre publique) |
|
|
détruit la valeur contenue, s'il y en a une
(fonction membre publique) |
|
|
assigne le contenu
(fonction membre publique) |
|
Itérateurs |
|
|
(C++26)
|
retourne un itérateur vers le début
(fonction membre publique) |
|
(C++26)
|
retourne un itérateur vers la fin
(fonction membre publique) |
Observateurs |
|
|
accède à la valeur contenue
(fonction membre publique) |
|
|
vérifie si l'objet contient une valeur
(fonction membre publique) |
|
|
retourne la valeur contenue
(fonction membre publique) |
|
|
retourne la valeur contenue si disponible, une autre valeur sinon
(fonction membre publique) |
|
Opérations monadiques |
|
|
(C++23)
|
retourne le résultat de la fonction donnée sur la valeur contenue si elle existe, ou un
optional
vide sinon
(fonction membre publique) |
|
(C++23)
|
retourne un
optional
contenant la valeur contenue transformée si elle existe, ou un
optional
vide sinon
(fonction membre publique) |
|
(C++23)
|
retourne le
optional
lui-même s'il contient une valeur, ou le résultat de la fonction donnée sinon
(fonction membre publique) |
Modificateurs |
|
|
échange le contenu
(fonction membre publique) |
|
|
détruit toute valeur contenue
(fonction membre publique) |
|
|
construit la valeur contenue en place
(fonction membre publique) |
|
Fonctions non membres
|
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
|
compare les objets
optional
(modèle de fonction) |
|
(C++17)
|
crée un objet
optional
(modèle de fonction) |
|
(C++17)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
Classes d'assistance
|
(C++17)
|
prise en charge du hachage pour
std::optional
(spécialisation de modèle de classe) |
|
(C++17)
|
indicateur d'un
std::optional
qui ne contient pas de valeur
(classe) |
|
(C++17)
|
exception indiquant un accès vérifié à un optionnel qui ne contient pas de valeur
(classe) |
Aides
|
(C++17)
|
un objet de type
nullopt_t
(constante) |
|
étiquette de construction en place
(étiquette) |
Spécialisations d'assistance
|
template
<
class
T
>
constexpr bool ranges:: enable_view < std :: optional < T >> = true ; |
(depuis C++26) | |
Cette spécialisation de
ranges::enable_view
permet à
optional
de satisfaire
view
.
|
template
<
class
T
>
constexpr auto format_kind < std :: optional < T >> = range_format :: disabled ; |
(depuis C++26) | |
Cette spécialisation de
format_kind
désactive le
support du formatage des plages
de
optional
.
Guides de déduction
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_optional
|
201606L
|
(C++17) |
std::optional
|
202106L
|
(C++23)
(DR20) |
Entièrement constexpr | |
202110L
|
(C++23) | Opérations monadiques | |
__cpp_lib_optional_range_support
|
202406L
|
(C++26) |
Support des gammes pour
std::optional
|
Exemple
#include <iostream> #include <optional> #include <string> // optional peut être utilisé comme type de retour d'une factory qui peut échouer std::optional<std::string> create(bool b) { if (b) return "Godzilla"; return {}; } // std::nullopt peut être utilisé pour créer n'importe quel std::optional (vide) auto create2(bool b) { return b ? std::optional<std::string>{"Godzilla"} : std::nullopt; } int main() { std::cout << "create(false) a retourné " << create(false).value_or("vide") << '\n'; // les fonctions factory retournant un optional sont utilisables comme conditions dans while et if if (auto str = create2(true)) std::cout << "create2(true) a retourné " << *str << '\n'; }
Sortie :
create(false) returned empty create2(true) returned Godzilla
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement correct |
|---|---|---|---|
| LWG 4141 | C++17 |
l'exigence d'allocation de stockage
était confuse |
l'objet contenu doit être
imbriqué dans l'objet
optional
|
Voir aussi
|
(C++17)
|
une union discriminée type-safe
(modèle de classe) |
|
(C++17)
|
objets contenant des instances de tout type
CopyConstructible
(classe) |
|
(C++23)
|
un wrapper contenant soit une valeur attendue soit une erreur
(modèle de classe) |
une
view
contenant un seul élément d'une valeur spécifiée
(modèle de classe) (objet de point de personnalisation) |
|
|
(C++20)
|
une
view
vide sans éléments
(modèle de classe) (modèle de variable) |