std::variant<Types...>::emplace
Von cppreference.com
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) |
Erstellt einen neuen Wert inplace 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 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 an der Überladungsauflösung teil, wenn std::is_constructible_v<T, std::initializer_list<U>&, Args...> true ist und
Tgenau einmal inTypes...vorkommt.
3) Zuerst wird der aktuell enthaltene Wert (falls vorhanden) zerstört. Dann wird der enthaltene Wert durch direkte Initialisierung initialisiert, als ob ein Wert vom Typ
T_I mit den Argumenten std::forward<Args>(args)... konstruiert würde. Wenn eine Ausnahme ausgelöst wird, kann *this 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 Kompilierungsfehler, wenn
Inicht kleiner als sizeof...(Types) ist.
4) Zuerst wird der aktuell enthaltene Wert (falls vorhanden) zerstört. Dann wird der enthaltene Wert durch direkte Initialisierung initialisiert, als ob ein Wert vom Typ
T_I mit den Argumenten il, std::forward<Args>(args)... konstruiert würde. Wenn eine Ausnahme ausgelöst wird, kann *this valueless_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 Kompilierungsfehler, wenn
Inicht kleiner als sizeof...(Types) ist.
Inhalt |
[edit] Parameter
| args | - | Konstruktorargumente, die beim Erstellen des neuen Werts verwendet werden sollen |
| il | - | Initializer-List-Argument, das beim Erstellen des neuen Werts verwendet werden soll |
[edit] Rückgabewert
Ein Verweis auf den neu enthaltenen Wert.
[edit] Ausnahmen
1-4) Jede Ausnahme, die während der Initialisierung des enthaltenen Werts ausgelöst wird.
[edit] Hinweise
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_variant |
202106L |
(C++20) (DR) |
Vollständig constexpr std::variant (1-4) |
[edit] Beispiel
Führen Sie diesen Code aus
#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"); -> Error }
Ausgabe
abc def ghi
[edit] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P2231R1 | C++20 | emplace war nicht constexpr, während die erforderlichen Operationen in C++20 constexpr sein können |
zu constexpr gemacht |
[edit] Siehe auch
weist einem variant zu(public member function) |