Namensräume
Varianten
Aktionen

std::optional<T>::emplace

Von cppreference.com
< cpp‎ | utility‎ | optional
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
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

#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) [edit]