Namespaces
Variants

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

From cppreference.net
Utilities library
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 en place, dans un objet variant existant

1) Équivalent à emplace < I > ( std:: forward < Args > ( args ) ... ) , où I est l'indice de base zéro de T dans Types... .
  • Cette surcharge participe à la résolution de surcharge seulement si std:: is_constructible_v < T, Args... > est true , et T apparaît exactement une fois dans Types... .
2) Équivalent à emplace < I > ( il, std:: forward < Args > ( args ) ... ) , où I est l'index de base zéro de T dans Types... .
3) D'abord, détruit la valeur actuellement contenue (s'il y en a une). Ensuite, initialise directement la valeur contenue comme si on 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 seulement 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) D'abord, détruit la valeur actuellement contenue (s'il y en a une). Ensuite, initialise directement la valeur contenue comme si on 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 .

Table des matières

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)