Namespaces
Variants

std::optional<T>:: optional

From cppreference.net
Utilities library
constexpr optional ( ) noexcept ;
(1) (depuis C++17)
constexpr optional ( std:: nullopt_t ) noexcept ;
(2) (depuis C++17)
constexpr optional ( const optional & other ) ;
(3) (depuis C++17)
constexpr optional ( optional && other ) noexcept ( /* voir ci-dessous */ ) ;
(4) (depuis C++17)
template < class U >
optional ( const optional < U > & other ) ;
(5) (depuis C++17)
(constexpr depuis C++20)
(conditionnellement explicite)
template < class U >
optional ( optional < U > && other ) ;
(6) (depuis C++17)
(constexpr depuis C++20)
(conditionnellement explicite)
template < class ... Args >
constexpr explicit optional ( std:: in_place_t , Args && ... args ) ;
(7) (depuis C++17)
template < class U, class ... Args >

constexpr explicit optional ( std:: in_place_t ,
std:: initializer_list < U > ilist,

Args && ... args ) ;
(8) (depuis C++17)
template < class U = std:: remove_cv_t < T > >
constexpr optional ( U && value ) ;
(9) (depuis C++17)
(conditionnellement explicite)

Construit un nouvel objet optional .

Table des matières

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

Effets

Surcharge Méthode d'initialisation Initialisateur pour la valeur contenue has_value() après construction
( 1 ) N/A - false
( 2 )
( 3 ) Initialisation directe (non-liste) * other other. has_value ( )
  • Si false , la valeur contenue n'est pas initialisée.
( 4 ) std :: move ( * other )
( 5 ) * other
( 6 ) std :: move ( * other )
( 7 ) std:: forward < Args > ( args ) ... true
( 8 ) ilist, std:: forward < Args > ( args ) ...
( 9 ) std:: forward < U > ( value )

Contraintes et informations supplémentaires

3) Si std:: is_copy_constructible_v < T > est false , le constructeur est défini comme supprimé.
Si std:: is_trivially_copy_constructible_v < T > est true , le constructeur est trivial.
4) Cette surcharge participe à la résolution de surcharge uniquement si std:: is_move_constructible_v < T > est true .
Si std:: is_trivially_move_constructible_v < T > est true , le constructeur est trivial.
5) Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :
Cette surcharge est déclarée comme si avec explicit ( ! std:: is_convertible_v < const U & , T > ) .
6) Cette surcharge participe à la résolution de surcharge uniquement si toutes les conditions suivantes sont satisfaites :
Cette surcharge est déclarée comme si avec explicit ( ! std:: is_convertible_v < U, T > ) .
7) Cette surcharge participe à la résolution de surcharge uniquement si std:: is_constructible_v < T, Args... > est true .
Si T le constructeur sélectionné pour l'initialisation est un constexpr constructeur, ce constructeur est également un constexpr constructeur.
8) Cette surcharge participe à la résolution de surcharge seulement si std:: is_constructible_v < T, std:: initializer_list < U > & , Args... > est true .
Si T le constructeur sélectionné pour l'initialisation est un constexpr constructeur, ce constructeur est également un constexpr constructeur.
9) Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :
Cette surcharge est déclarée comme si avec explicit ( ! std:: is_convertible_v < U, T > ) .
Si T le constructeur sélectionné pour l'initialisation est un constexpr constructeur, ce constructeur est également un constexpr constructeur.
  1. 1.0 1.1 En d'autres termes, T n'est ni constructible ni convertible à partir d'une expression de type (éventuellement qualifié const) std:: optional < U >

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 .

Guides de déduction

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)