std::construct_at
| Definiert in Header <memory> |
||
| template< class T, class... Args > constexpr T* construct_at( T* location, Args&&... args ); |
(seit C++20) | |
Erstellt ein T-Objekt, das mit den Argumenten in args an der angegebenen Adresse location initialisiert wird.
Äquivalent zu if constexpr (std::is_array_v<T>)
return ::new (voidify (*location)) T[1]();
else
return ::new (voidify (*location)) T(std::forward<Args>(args)...); , mit der Ausnahme, dass construct_at bei der Auswertung von konstanten Ausdrücken verwendet werden kann(bis C++26).
Wenn construct_at bei der Auswertung eines konstanten Ausdrucks expr aufgerufen wird, muss location entweder auf einen Speicher zeigen, der durch std::allocator<T>::allocate erhalten wurde, oder auf ein Objekt, dessen Lebensdauer innerhalb der Auswertung von expr begonnen hat.
Dieser Überladung nimmt nur an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:
- std::is_unbounded_array_v<T> ist false.
- ::new(std::declval<void*>()) T(std::declval<Args>()...) ist wohlgeformt, wenn es als nicht ausgewerteter Operand behandelt wird.
Wenn std::is_array_v<T> true ist und sizeof...(Args) ungleich Null ist, ist das Programm fehlerhaft.
Inhalt |
[bearbeiten] Parameter
| location | - | Zeiger auf den uninitialisierten Speicher, auf dem ein T-Objekt konstruiert werden soll |
| args... | - | Argumente, die für die Initialisierung verwendet werden |
[bearbeiten] Rückgabewert
location
[bearbeiten] Beispiel
#include <bit> #include <memory> class S { int x_; float y_; double z_; public: constexpr S(int x, float y, double z) : x_{x}, y_{y}, z_{z} {} [[nodiscard("no side-effects!")]] constexpr bool operator==(const S&) const noexcept = default; }; consteval bool test() { alignas(S) unsigned char storage[sizeof(S)]{}; S uninitialized = std::bit_cast<S>(storage); std::destroy_at(&uninitialized); S* ptr = std::construct_at(std::addressof(uninitialized), 42, 2.71f, 3.14); const bool res{*ptr == S{42, 2.71f, 3.14}}; std::destroy_at(ptr); return res; } static_assert(test()); int main() {}
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3436 | C++20 | construct_at konnte keine Objekte von Array-Typen erstellen |
kann begrenzte Arrays wertinitialisieren |
| LWG 3870 | C++20 | construct_at konnte Objekte von cv-qualifizierten Typen erstellen |
nur cv-unqualifizierte Typen sind zulässig |
[bearbeiten] Siehe auch
| alloziiert uninitialisierten Speicher (public member function of std::allocator<T>) | |
| [static] |
konstruiert ein Objekt im allozierten Speicher (function template) |
| (C++17) |
zerstört ein Objekt an einer gegebenen Adresse (Funktions-Template) |
| (C++20) |
erstellt ein Objekt an einer gegebenen Adresse (Algorithmus-Funktionsobjekt) |