Namespaces
Variants

std::construct_at

Von de.cppreference.net
 
 
Algorithm library
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z. B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
 
Definiert in Header <memory>
template< class T, class... Args >
constexpr T* construct_at( T* location, Args&&... args );
(seit C++20)

Erzeugt 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)...);
, außer dass construct_at in der Auswertung von konstanten Ausdrücken(bis C++26) verwendet werden kann.

Wenn construct_at in der Auswertung eines konstanten Ausdrucks expr aufgerufen wird, muss location entweder auf einen durch std::allocator<T>::allocate erhaltenen Speicher oder auf ein Objekt zeigen, dessen Lebensdauer innerhalb der Auswertung von expr begonnen hat.

Diese Ü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) nicht Null ist, ist das Programm fehlerhaft.

Parameter

location - Zeiger auf den nicht initialisierten Speicher, auf dem ein T -Objekt konstruiert wird
args... - Argumente für die Initialisierung

Rückgabewert

location

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() {}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Richtiges Verhalten
LWG 3436 C++20 construct_at konnte keine Objekte von Array-Typen erzeugen kann begrenzte Arrays wertinitialisieren

Siehe auch

weist nicht initialisierten Speicher zu
(öffentliche Elementfunktion von std::allocator<T> )
[static]
konstruiert ein Objekt im zugewiesenen Speicher
(Funktionstemplate)
(C++17)
zerstört ein Objekt an einer gegebenen Adresse
(Funktionstemplate)
erstellt ein Objekt an einer gegebenen Adresse
(Algorithmus-Funktionsobjekt)