Namespaces
Variants

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

From cppreference.net
Utilities library
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 an Ort und Stelle, in einem bestehenden variant -Objekt

1) Entspricht emplace < I > ( std:: forward < Args > ( args ) ... ) , wobei I der nullbasierte Index von T in Types... ist.
  • Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_constructible_v < T, Args... > true ist und T genau einmal in Types... vorkommt.
2) Entspricht emplace < I > ( il, std:: forward < Args > ( args ) ... ) , wobei I der nullbasierte Index von T in Types... ist.
3) Zerstört zunächst den aktuell enthaltenen Wert (falls vorhanden). Initialisiert dann direkt den enthaltenen Wert, als ob ein Wert vom Typ T_I mit den Argumenten std:: forward < Args > ( args ) ... konstruiert würde. Wenn eine Exception ausgelöst wird, kann * this zu valueless_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 Kompilierfehler, wenn I nicht kleiner als sizeof... ( Types ) ist.
4) Zerstört zunächst den aktuell enthaltenen Wert (falls vorhanden). Initialisiert dann direkt den enthaltenen Wert, als ob ein Wert vom Typ T_I mit den Argumenten il, std:: forward < Args > ( args ) ... konstruiert würde. Wenn eine Exception ausgelöst wird, kann * this zu valueless_by_exception werden.

Inhaltsverzeichnis

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)