Namespaces
Variants

std::variant<Types...>::emplace

Depuis fr.cppreference.net
 
 
Bibliothèque des 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 (obsolète en C++20)
 
 
template< class T, class... Args >
T& emplace( Args&&... args );
(1) (depuis C++17)
(constexpr depuis C++20)
template< class T, class U, class... Args >
T& emplace( std::initializer_list<U> il, Args&&... args );
(2) (depuis C++17)
(constexpr depuis C++20)
template< std::size_t I, class... Args >
std::variant_alternative_t<I, variant>& emplace( Args&&... args );
(3) (depuis C++17)
(constexpr depuis C++20)
template< std::size_t I, class U, class... Args >
std::variant_alternative_t<I, variant>&
    emplace( std::initializer_list<U> il, Args&&... args );
(4) (depuis C++17)
(constexpr depuis C++20)

Crée une nouvelle valeur sur place, dans un objet variant existant.

1) Équivalent à emplace<I>(std::forward<Args>(args)...), où I est l'indice basé sur zéro de T dans Types....
  • Cette surcharge participe à la résolution de surcharge uniquement si std::is_constructible_v<T, Args...> est true, et que T apparaît exactement une fois dans Types....
2) Équivalent à emplace<I>(il, std::forward<Args>(args)...), où I est l'indice basé sur zéro de T dans Types....
  • Cette surcharge participe à la résolution de surcharge uniquement si std::is_constructible_v<T, std::initializer_list<U>&, Args...> est true, et que T apparaît exactement une fois dans Types....
3) Premièrement, détruit la valeur actuellement contenue (s'il y en a une). Ensuite, initialise directement la valeur contenue comme si elle construisait une valeur de type T_I avec les arguments std::forward<Args>(args).... Si une exception est levée, *this peut devenir valueless_by_exception.
  • Cette surcharge participe à la résolution de surcharge uniquement si std::is_constructible_v<T_I, Args...> est true.
  • C'est une erreur de compilation si I n'est pas inférieur à sizeof...(Types).
4) Premièrement, détruit la valeur actuellement contenue (s'il y en a une). Ensuite, initialise directement la valeur contenue comme si elle construisait une valeur de type T_I avec les arguments il, std::forward<Args>(args).... Si une exception est levée, *this peut devenir valueless_by_exception.
  • Cette surcharge participe à la résolution de surcharge uniquement si std::is_constructible_v<T_I, std::initializer_list<U>&, Args...> est true.
  • C'est une erreur de compilation si I n'est pas inférieur à sizeof...(Types).

Paramètres

args - arguments du constructeur à utiliser lors de la construction de la nouvelle valeur
il - argument initializer_list à utiliser lors de la construction de la nouvelle valeur

Valeur de retour

Une référence à la nouvelle valeur contenue.

Exceptions

1-4) Toute exception levée durant l'initialisation de la valeur contenue.

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_variant 202106L (C++20)
(DR)
std::variant entièrement constexpr ( 1-4 )

Exemple

#include <iostream>
#include <string>
#include <variant>
int main()
{
    std::variant<std::string> v1;
    v1.emplace<0>("abc"); // OK
    std::cout << std::get<0>(v1) << '\n';
    v1.emplace<std::string>("def"); // OK
    std::cout << std::get<0>(v1) << '\n';
    std::variant<std::string, std::string> v2;
    v2.emplace<1>("ghi"); // OK
    std::cout << std::get<1>(v2) << '\n';
    // v2.emplace<std::string>("abc"); -> Erreur
}

Sortie :

abc
def
ghi

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é
P2231R1 C++20 emplace n'était pas constexpr alors que les opérations requises peuvent être constexpr en C++20 rendu constexpr

Voir aussi

assigne un variant
(fonction membre publique)