std::variant<Types...>:: emplace
From 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
>
&
|
(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
Tgenau einmal inTypes...vorkommt.
2)
Entspricht
emplace
<
I
>
(
il,
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,
std::
initializer_list
<
U
>
&
, Args...
>
true
ist und
Tgenau einmal inTypes...vorkommt.
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
Inicht 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.
- Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_constructible_v < T_I, std:: initializer_list < U > & , Args... > true ist.
-
Es ist ein Kompilierfehler, wenn
Inicht kleiner als sizeof... ( Types ) ist.
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
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) |