std::optional<T>::optional
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.
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>estfalse. - C'est un constructeur trivial si
std::is_trivially_copy_constructible_v<T>esttrue.
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>esttrue. - C'est un constructeur trivial si
std::is_trivially_move_constructible_v<T>esttrue.
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&>esttrue.- Si
Tn'est pas (éventuellement cv-qualifié)bool,Tn'est pas constructible ou convertible à partir d'une expression de type (éventuellementconst)std::optional<U>, c'est-à-direconverts_from_any_cvref<T, std::optional<U>>estfalse, oùconverts_from_any_cvrefest décrit ci-dessous.
- Ce constructeur est
explicitsi et seulement sistd::is_convertible_v<const U&, T>estfalse.
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&&>esttrue.- Si
Tn'est pas (éventuellement cv-qualifié)bool,Tn'est pas constructible ou convertible à partir d'une expression de type (éventuellementconst)std::optional<U>, c'est-à-direconverts_from_any_cvref<T, std::optional<U>>estfalse, oùconverts_from_any_cvrefest décrit ci-dessous.
- Ce constructeur est
explicitsi et seulement sistd::is_convertible_v<U&&, T>estfalse.
T à partir des arguments std::forward<Args>(args)....
- Si le constructeur sélectionné de
Test un constructeurconstexpr, ce constructeur est un constructeurconstexpr. - La fonction ne participe pas à la résolution de surcharge sauf si
std::is_constructible_v<T, Args...>esttrue.
T à partir des arguments ilist, std::forward<Args>(args)....
- Si le constructeur sélectionné de
Test un constructeurconstexpr, ce constructeur est un constructeurconstexpr. - La fonction ne participe pas à la résolution de surcharge sauf si
std::is_constructible_v<T, std::initializer_list<U>&, Args...>esttrue.
T avec l'expression std::forward<U>(value).
- Si le constructeur sélectionné de
Test un constructeurconstexpr, ce constructeur est un constructeurconstexpr. - Ce constructeur ne participe pas à la résolution de surcharge sauf si les conditions suivantes sont remplies :
std::is_constructible_v<T, U&&>esttrue.std::decay_t<U>(jusqu'à C++20)std::remove_cvref_t<U>(depuis C++20) n'est ni std::in_place_t nistd::optional<T>.- Si
Test (é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 destd::optional.
- Ce constructeur est
explicitsi et seulement sistd::is_convertible_v<U&&, T>estfalse.
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
T
.
T
. Possède la spécification
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
|
(C++17)
|
crée un objet
optional
(modèle de fonction) |