std::expected<T,E>::transform
template< class F >
constexpr auto transform( F&& f ) &;
|
(1) | (depuis C++23) |
template< class F >
constexpr auto transform( F&& f ) const&;
|
(2) | (depuis C++23) |
template< class F >
constexpr auto transform( F&& f ) &&;
|
(3) | (depuis C++23) |
template< class F >
constexpr auto transform( F&& f ) const&&;
|
(4) | (depuis C++23) |
Si *this contient une valeur attendue, invoque f et renvoie un objet std::expected qui contient son résultat ; sinon, renvoie un objet std::expected qui contient une copie de error().
Si T n'est pas (éventuellement qualifié cv) void, la valeur contenue (operator*()) est passée comme argument à f ; sinon f ne prend aucun argument.
Soit U défini comme :
- si
Tn'est pas (éventuellement qualifié cv)void:- pour les surcharges (1-2),
std::remove_cv_t<std::invoke_result_t<F, decltype(operator*())>>; - pour les surcharges (3-4),
std::remove_cv_t<std::invoke_result_t<F, decltype(std::move(operator*()))>>;
- pour les surcharges (1-2),
- sinon (
Test éventuellement qualifié cvvoid),std::remove_cv_t<std::invoke_result_t<F>>.
Udoit être un type de valeur valide pour std::expected. Une variable de type U doit pouvoir être construite à partir du résultat de l'invocation (mais n'a pas besoin d'être constructible par déplacement). Le type de retour est std::expected<U, E>.
std::is_constructible_v<E, decltype(error())> est true.std::is_constructible_v<E, decltype(std::move(error()))> est true.Formellement, ces fonctions effectuent les étapes suivantes :
- Si
*thiscontient une valeur attendueval:
- Invoque
fcomme si parstd::invoke(std::forward<F>(f), val)pour les surcharges (1,2) sistd::is_void_v<T>estfalse;std::invoke(std::forward<F>(f), std::move(val))pour les surcharges (3,4) sistd::is_void_v<T>estfalse;std::invoke(std::forward<F>(f))sistd::is_void_v<T>esttrue.
- Ensuite :
- si
std::is_void_v<U>estfalse, renvoie un objetstd::expectedqui contient une valeur attendue, initialisée directement à partir du résultat de l'invocation ; - sinon, renvoie
std::expected<U, E>().
- si
- Invoque
- Sinon (
*thiscontient une valeur d'erreur), renvoiestd::expected<U, E>(std::unexpect, error()).
Paramètres
| f | - | une fonction appropriée ou Callable objet dont la signature d'appel retourne un type non-référence |
Valeur de retour
Expression donnée expr comme :
val
)
val
)
)
Les valeurs de retour sont définies comme suit :
| Surcharge |
Valeur de
has_value()
|
|
|---|---|---|
| true | false | |
| ( 1,2 ) |
|
std:: expected < U, E > ( std:: unexpect , error ( ) ) |
| ( 3,4 ) |
std::
expected
<
U, E
>
(
std::
unexpect
, std
::
move
(
error
(
)
)
)
|
|
| ( 5,6 ) | std:: expected < U, E > ( std:: unexpect , error ( ) ) | |
| ( 7,8 ) |
std::
expected
<
U, E
>
(
std::
unexpect
, std
::
move
(
error
(
)
)
)
|
|
Notes
| Macro de test de fonctionnalité | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_expected |
202211L |
(C++23) | Fonctions monadiques pour std::expected
|
Exemple
|
Cette section est incomplète
Raison : aucun exemple |
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 3938 | C++23 | la valeur attendue était obtenue par value ( ) [1] | modifié en ** this |
| LWG 3973 | C++23 | la valeur attendue était obtenue par ** this [2] |
modifié en
val
|
-
↑
value()nécessite queEsoit copiable (voir LWG issue 3843 ), alors queoperator*ne le nécessite pas. - ↑ ** this peut déclencher la recherche dépendante des arguments .
Voir aussi
retourne l'
expected
lui-même s'il contient une valeur attendue ; sinon, retourne un
expected
contenant la valeur inattendue transformée
(fonction membre publique) |