std::optional<T>::emplace
Von cppreference.com
template< class... Args > T& emplace( Args&&... args ); |
(1) | (seit C++17) (constexpr seit C++20) |
template< class U, class... Args > T& emplace( std::initializer_list<U> ilist, Args&&... args ); |
(2) | (seit C++17) (constexpr seit C++20) |
Konstruiert den enthaltenen Wert an Ort und Stelle. Wenn *this bereits einen Wert vor dem Aufruf enthält, wird der enthaltene Wert durch Aufruf seines Destruktors zerstört.
1) Initialisiert den enthaltenen Wert durch direkte Initialisierung (aber nicht durch direkte Listeninitialisierung) mit std::forward<Args>(args)... als Parameter.
2) Initialisiert den enthaltenen Wert durch Aufruf seines Konstruktors mit ilist, std::forward<Args>(args)... als Parameter. Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value true ist.
Inhalt |
[edit] Parameter
| args... | - | die Argumente, die an den Konstruktor übergeben werden sollen |
| ilist | - | die Initialisierungsliste, die an den Konstruktor übergeben werden soll |
| Typanforderungen | ||
-T muss für Überladung (1) aus Args... konstruierbar sein | ||
-T muss für Überladung (2) aus std::initializer_list und Args... konstruierbar sein | ||
[edit] Rückgabewert
Eine Referenz auf den neuen enthaltenen Wert.
[edit] Ausnahmen
Jede Ausnahme, die vom ausgewählten Konstruktor von T ausgelöst wird. Wenn eine Ausnahme ausgelöst wird, enthält *this nach diesem Aufruf keinen Wert (der zuvor enthaltene Wert wurde, falls vorhanden, zerstört).
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_optional |
202106L |
(C++20) (DR20) |
constexpr bis zum Ende ((1,2)) |
[edit] Beispiel
Führen Sie diesen Code aus
#include <iostream> #include <optional> struct A { std::string s; A(std::string str) : s(std::move(str)), id{n++} { note("+ constructed"); } ~A() { note("~ destructed"); } A(const A& o) : s(o.s), id{n++} { note("+ copy constructed"); } A(A&& o) : s(std::move(o.s)), id{n++} { note("+ move constructed"); } A& operator=(const A& other) { s = other.s; note("= copy assigned"); return *this; } A& operator=(A&& other) { s = std::move(other.s); note("= move assigned"); return *this; } inline static int n{}; int id{}; void note(auto s) { std::cout << " " << s << " #" << id << '\n'; } }; int main() { std::optional<A> opt; std::cout << "Assign:\n"; opt = A("Lorem ipsum dolor sit amet, consectetur adipiscing elit nec."); std::cout << "Emplace:\n"; // As opt contains a value it will also destroy that value opt.emplace("Lorem ipsum dolor sit amet, consectetur efficitur."); std::cout << "End example\n"; }
Ausgabe
Assign: + constructed #0 + move constructed #1 ~ destructed #0 Emplace: ~ destructed #1 + constructed #2 End example ~ destructed #2
[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, obwohl die erforderlichen Operationen in C++20 constexpr sein können |
zu constexpr gemacht |
[edit] Siehe auch
| weist Inhalte zu (public member function) |