std::variant<Types...>::emplace
Aus de.cppreference.net
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...>trueist undTgenau einmal inTypes...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...>trueist undTgenau einmal inTypes...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...>trueist. - Es ist ein Compilerfehler, wenn
Inicht kleiner alssizeof...(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...>trueist. - Es ist ein Compilerfehler, wenn
Inicht kleiner alssizeof...(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
Diesen Code ausführen
#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) |