Namespaces
Variants

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

Aus de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Feature-Test-Makros der Bibliothek (C++20)
Programmdienstprogramme
Variadische Funktionen
Koroutinen-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationale Operatoren (veraltet in C++20)
Ganzzahlvergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gebräuchliche Vokabultypen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
template< class T, class... Args >
T& emplace( Args&&... args );
(1) (seit C++17)
(constexpr seit C++20)
template< class T, class U, class... Args >
T& emplace( std::initializer_list<U> il, Args&&... args );
(2) (seit C++17)
(constexpr seit C++20)
template< std::size_t I, class... Args >
std::variant_alternative_t<I, variant>& emplace( Args&&... args );
(3) (seit C++17)
(constexpr seit 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) (seit C++17)
(constexpr seit C++20)

Erzeugt einen neuen Wert direkt (in-place) in einem vorhandenen variant-Objekt.

1) Äquivalent zu emplace<I>(std::forward<Args>(args)...), wobei I der nullbasierte Index von T in Types... ist.
  • Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_constructible_v<T, Args...>true ist und T genau einmal in Types... vorkommt.
2) Äquivalent zu emplace<I>(il, std::forward<Args>(args)...), wobei I der nullbasierte Index von T in Types... ist.
  • Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_constructible_v<T, std::initializer_list<U>&, Args...>true ist und T genau einmal in Types... vorkommt.
3) Zerstört zunächst den aktuell enthaltenen Wert (falls vorhanden). Dann direktinitialisiert es den enthaltenen Wert, als würde ein Wert des Typs T_I mit den Argumenten std::forward<Args>(args)... konstruiert. Wenn eine Ausnahme ausgelöst wird, kann *thisvalueless_by_exception werden.
  • Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_constructible_v<T_I, Args...>true ist.
  • Es ist ein Compilerfehler, wenn I nicht kleiner als sizeof...(Types) ist.
4) Zerstört zunächst den aktuell enthaltenen Wert (falls vorhanden). Dann direktinitialisiert es den enthaltenen Wert, als würde ein Wert des Typs T_I mit den Argumenten il, std::forward<Args>(args)... konstruiert. Wenn eine Ausnahme ausgelöst wird, kann *thisvalueless_by_exception werden.
  • Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_constructible_v<T_I, std::initializer_list<U>&, Args...>true ist.
  • Es ist ein Compilerfehler, wenn I nicht kleiner als sizeof...(Types) ist.

Parameter

args - Konstruktorargumente, die bei der Konstruktion des neuen Werts verwendet werden
il - initializer_list-Argument, das bei der Konstruktion des neuen Werts verwendet wird

Rückgabewert

Eine Referenz auf den neuen enthaltenen Wert.

Ausnahmen

1-4) Jede Ausnahme, die während der Initialisierung des enthaltenen Werts ausgelöst wird.

Hinweise

Feature-Test Makro Wert Std Feature
__cpp_lib_variant 202106L (C++20)
(DR)
Vollständig constexpr std::variant ( 1-4 )

Beispiel

#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"); -> Fehler
}

Ausgabe:

abc
def
ghi

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
P2231R1 C++20 emplace war nicht constexpr während die erforderlichen Operationen in C++20 constexpr sein können als constexpr festgelegt

Siehe auch

weist ein variant zu
(öffentliche Elementfunktion)