Namespaces
Variants

std:: optional

From cppreference.net
Utilities library
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 T ou d'un autre optional qui 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 optional qui ne contient pas de valeur.
  • La fonction membre reset() est appelée.

L'objet optional est une view qui contient soit un élément s'il contient une valeur , soit zéro élément s'il ne contient pas de valeur. La durée de vie de l'élément contenu est lié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)
crée un objet optional
(modèle de fonction)
spécialise l'algorithme std::swap
(modèle de fonction)

Classes d'assistance

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)
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)
une view vide sans éléments
(modèle de classe) (modèle de variable)