std::optional<T>:: optional
|
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
,
|
(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
(
)
|
| ( 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
- std:: is_constructible_v < T, const U & > est true .
-
Si
Tn'est pas (éventuellement qualifié cv) bool , les 8 valeurs suivantes sont toutes false [1] :- std:: is_constructible_v < T, std:: optional < U > & >
- std:: is_constructible_v < T, const std:: optional < U > & >
- std:: is_constructible_v < T, std:: optional < U > && >
- std:: is_constructible_v < T, const std:: optional < U > && >
- std:: is_convertible_v < std:: optional < U > & , T >
- std:: is_convertible_v < const std:: optional < U > & , T >
- std:: is_convertible_v < std:: optional < U > && , T >
- std:: is_convertible_v < const std:: optional < U > && , T >
- std:: is_constructible_v < T, U > est true .
-
Si
Tn'est pas (éventuellement qualifié cv) bool , les 8 valeurs suivantes sont toutes false [1] :- std:: is_constructible_v < T, std:: optional < U > & >
- std:: is_constructible_v < T, const std:: optional < U > & >
- std:: is_constructible_v < T, std:: optional < U > && >
- std:: is_constructible_v < T, const std:: optional < U > && >
- std:: is_convertible_v < std:: optional < U > & , T >
- std:: is_convertible_v < const std:: optional < U > & , T >
- std:: is_convertible_v < std:: optional < U > && , T >
- std:: is_convertible_v < const std:: optional < U > && , T >
T
le constructeur sélectionné pour l'initialisation est un
constexpr
constructeur, ce constructeur est également un
constexpr
constructeur.
T
le constructeur sélectionné pour l'initialisation est un
constexpr
constructeur, ce constructeur est également un
constexpr
constructeur.
- std:: is_constructible_v < T, U > est true .
- std:: decay_t < U > (jusqu'en C++20) std:: remove_cvref_t < U > (depuis C++20) n'est ni std::in_place_t ni std:: optional < T > .
-
Si
Test (éventuellement qualifié cv) bool , std:: decay_t < U > (jusqu'en C++20) std:: remove_cvref_t < U > (depuis C++20) n'est pas une spécialisation destd::optional.
T
le constructeur sélectionné pour l'initialisation est un
constexpr
constructeur, ce constructeur est également un
constexpr
constructeur.
-
↑
1.0
1.1
En d'autres termes,
Tn'est ni constructible ni convertible à partir d'une expression de type (éventuellement qualifié const) std:: optional < U >
Exceptions
T
.
T
. Possède la spécification
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
|
(C++17)
|
crée un objet
optional
(modèle de fonction) |