Namespaces
Variants

std::expected<T,E>::transform

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
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)
 
 
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 T n'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*()))>> ;
  • sinon (T est éventuellement qualifié cv void), 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>.

1-2) Ces surcharges ne participent à la résolution de surcharge que si std::is_constructible_v<E, decltype(error())> est true.
3-4) Ces surcharges ne participent à la résolution de surcharge que si std::is_constructible_v<E, decltype(std::move(error()))> est true.

Formellement, ces fonctions effectuent les étapes suivantes :

  • Si *this contient une valeur attendue val :
  1. Invoque f comme si par
    • std::invoke(std::forward<F>(f), val) pour les surcharges (1,2) si std::is_void_v<T> est false ;
    • std::invoke(std::forward<F>(f), std::move(val)) pour les surcharges (3,4) si std::is_void_v<T> est false ;
    • std::invoke(std::forward<F>(f)) si std::is_void_v<T> est true.
  2. Ensuite :
    • si std::is_void_v<U> est false, renvoie un objet std::expected qui contient une valeur attendue, initialisée directement à partir du résultat de l'invocation ;
    • sinon, renvoie std::expected<U, E>().
  • Sinon (*this contient une valeur d'erreur), renvoie std::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 :

1,2) std:: invoke ( std:: forward < F > ( f ) , val )
3,4) std:: invoke ( std:: forward < F > ( f ) ,std :: move ( val ) )
5-8) std:: invoke ( std:: forward < F > ( f ) )

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

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
  1. value() nécessite que E soit copiable (voir LWG issue 3843 ), alors que operator* ne le nécessite pas.
  2. ** 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)