Namespaces
Variants

std::optional<T>::optional

De fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déprécié en C++20)
 
 
constexpr optional() noexcept;
constexpr optional( std::nullopt_t ) noexcept;
(1) (depuis C++17)
constexpr optional( const optional& other );
(2) (depuis C++17)
constexpr optional( optional&& other ) noexcept(/* see below */);
(3) (depuis C++17)
template < class U >
optional( const optional<U>& other );
(4) (depuis C++17)
(constexpr depuis C++20)
(conditionnellement explicite)
template < class U >
optional( optional<U>&& other );
(5) (depuis C++17)
(constexpr depuis C++20)
(conditionnellement explicite)
template< class... Args >
constexpr explicit optional( std::in_place_t, Args&&... args );
(6) (depuis C++17)
template< class U, class... Args >
constexpr explicit optional( std::in_place_t,
                             std::initializer_list<U> ilist,
                             Args&&... args );
(7) (depuis C++17)
template < class U = std::remove_cv_t<T> >
constexpr optional( U&& value );
(8) (depuis C++17)
(conditionnellement explicite)

Construit un nouvel objet optional.

1) Construit un objet qui ne contient pas de valeur.
2) Constructeur de copie : Si other contient une valeur, initialise la valeur contenue comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T avec l'expression *other. Si other ne contient pas de valeur, construit un objet qui ne contient pas de valeur.
  • Ce constructeur est défini comme supprimé si std::is_copy_constructible_v<T> est false.
  • C'est un constructeur trivial si std::is_trivially_copy_constructible_v<T> est true.
3) Constructeur de déplacement : Si other contient une valeur, initialise la valeur contenue comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T avec l'expression std::move(*other) et ne rend pas other vide : un std::optional déplacé contient toujours une valeur, mais la valeur elle-même a été déplacée. Si other ne contient pas de valeur, construit un objet qui ne contient pas de valeur.
  • Ce constructeur ne participe pas à la résolution de surcharge sauf si std::is_move_constructible_v<T> est true.
  • C'est un constructeur trivial si std::is_trivially_move_constructible_v<T> est true.
4) Constructeur de copie convertissant : Si other ne contient pas de valeur, construit un objet optional qui ne contient pas de valeur. Sinon, construit un objet optional qui contient une valeur, initialisée comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T avec l'expression *other.
  • Ce constructeur ne participe pas à la résolution de surcharge sauf si les conditions suivantes sont remplies :
    • std::is_constructible_v<T, const U&> est true.
    • Si T n'est pas (éventuellement cv-qualifié) bool, T n'est pas constructible ou convertible à partir d'une expression de type (éventuellement const) std::optional<U>, c'est-à-dire converts_from_any_cvref<T, std::optional<U>> est false, où converts_from_any_cvref est décrit ci-dessous.
  • Ce constructeur est explicit si et seulement si std::is_convertible_v<const U&, T> est false.
5) Constructeur de déplacement convertissant : Si other ne contient pas de valeur, construit un objet optional qui ne contient pas de valeur. Sinon, construit un objet optional qui contient une valeur, initialisée comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T avec l'expression std::move(*other).
  • Ce constructeur ne participe pas à la résolution de surcharge sauf si les conditions suivantes sont remplies :
    • std::is_constructible_v<T, U&&> est true.
    • Si T n'est pas (éventuellement cv-qualifié) bool, T n'est pas constructible ou convertible à partir d'une expression de type (éventuellement const) std::optional<U>, c'est-à-dire converts_from_any_cvref<T, std::optional<U>> est false, où converts_from_any_cvref est décrit ci-dessous.
  • Ce constructeur est explicit si et seulement si std::is_convertible_v<U&&, T> est false.
6) Construit un objet optional qui contient une valeur, initialisée comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T à partir des arguments std::forward<Args>(args)....
  • Si le constructeur sélectionné de T est un constructeur constexpr, ce constructeur est un constructeur constexpr.
  • La fonction ne participe pas à la résolution de surcharge sauf si std::is_constructible_v<T, Args...> est true.
7) Construit un objet optional qui contient une valeur, initialisée comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T à partir des arguments ilist, std::forward<Args>(args)....
  • Si le constructeur sélectionné de T est un constructeur constexpr, ce constructeur est un constructeur constexpr.
  • La fonction ne participe pas à la résolution de surcharge sauf si std::is_constructible_v<T, std::initializer_list<U>&, Args...> est true.
8) Construit un objet optional qui contient une valeur, initialisée comme par initialisation directe (mais pas par initialisation directe de liste) d'un objet de type T avec l'expression std::forward<U>(value).
  • Si le constructeur sélectionné de T est un constructeur constexpr, ce constructeur est un constructeur constexpr.
  • Ce constructeur ne participe pas à la résolution de surcharge sauf si les conditions suivantes sont remplies :
    • std::is_constructible_v<T, U&&> est true.
    • std::decay_t<U>(jusqu'à C++20)std::remove_cvref_t<U>(depuis C++20) n'est ni std::in_place_t ni std::optional<T>.
    • Si T est (éventuellement cv-qualifié) bool, std::decay_t<U>(jusqu'à C++20)std::remove_cvref_t<U>(depuis C++20) n'est pas une spécialisation de std::optional.
  • Ce constructeur est explicit si et seulement si std::is_convertible_v<U&&, T> est false.

Le modèle de variable auxiliaire converts_from_any_cvref est équivalent à :

template< class T, class W >
constexpr bool converts_from_any_cvref =
    std::disjunction_v<std::is_constructible<T, W&>, std::is_convertible<W&, T>,
                       std::is_constructible<T, W>, std::is_convertible<W, T>,
                       std::is_constructible<T, const W&>, std::is_convertible<const W&, T>,
                       std::is_constructible<T, const W>, std::is_convertible<const W, T>>;

Paramètres

other - autre objet optional dont la valeur contenue est copiée
value - valeur avec laquelle initialiser la valeur contenue
args... - arguments avec lesquels initialiser la valeur contenue
ilist - liste d'initialisation avec laquelle initialiser la valeur contenue

Exceptions

3) Lance toute exception levée par le constructeur de T .
4) Lance toute exception levée par le constructeur de T . Possède la spécification
noexcept suivante :
noexcept ( std:: is_nothrow_move_constructible < T > :: value )
5-9) Lance toute exception levée par le constructeur de T .

Notes

Avant la résolution de LWG issue 3836 , la construction d'un std:: optional < bool > à partir d'un std:: optional < U > sélectionnait la surcharge ( 9 ) au lieu des surcharges ( 5,6 ) si U n'est pas bool . Ceci parce que les surcharges ( 5,6 ) ne participaient pas à la résolution de surcharge si T ( bool dans ce cas) peut être construit ou converti à partir de std:: optional < U > , mais std::optional::operator bool rend cette conversion possible pour tout U .

En conséquence, le std:: optional < bool > construit contient toujours une valeur. Cette valeur est déterminée par la présence ou non d'une valeur dans l'objet std:: optional < U > fourni, plutôt que par la valeur bool initialisée directement à partir de la valeur contenue :

std::optional<bool> op_false(false);
std::optional<int> op_zero(0);
std::optional<int> from_bool(op_false); // OK : contient 0 (initialisé à partir de false)
std::optional<bool> from_int(op_zero);  // DÉFAUT (LWG 3836) : contient true car
                                        // op_zero contient une valeur, même si l'initialisation
                                        // de bool à partir de cette valeur donne false
Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_optional 202106L (C++20)
(DR20)
Complètement constexpr ( 5,6 )

Exemple

#include <iostream>
#include <optional>
#include <string>
int main()
{
    std::optional<int> o1, // vide
                       o2 = 1, // initialisé à partir d'une rvalue
                       o3 = o2; // constructeur par copie
    // appelle le constructeur std::string( initializer_list<CharT> )
    std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});
    // appelle le constructeur std::string( size_type count, CharT ch )
    std::optional<std::string> o5(std::in_place, 3, 'A');
    // Construit par déplacement depuis std::string en utilisant le guide de déduction pour choisir le type
    std::optional o6(std::string{"deduction"});
    std::cout << *o2 << ' ' << *o3 << ' ' << *o4 << ' ' << *o5  << ' ' << *o6 << '\n';
}

Sortie :

1 1 abc AAA deduction

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 Appliqué à Comportement publié Comportement corrigé
LWG 3836 C++17 lors de la construction d'un std:: optional < bool >
à partir d'un std:: optional < U > , la résolution de surcharge
sélectionnait la surcharge ( 9 ) si U n'est pas bool
sélectionne toujours le
constructeur de copie/déplacement
de conversion dans ce cas
LWG 3886 C++17 l'argument template par défaut de la surcharge ( 9 ) était T modifié en std:: remove_cv_t < T >
P0602R4 C++17 les constructeurs de copie/déplacement pourraient ne pas être triviaux
même si le constructeur sous-jacent est trivial
requis pour
propager la trivialité
P2231R1 C++20 les surcharges ( 5,6 ) d'un autre std::optional n'étaient pas constexpr rendues constexpr

Voir aussi

crée un objet optional
(modèle de fonction)