Namespaces
Variants

std::ranges::construct_at

Von de.cppreference.net
 
 
Algorithmusbibliothek
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 zugehörige Operationen
Partitionierungsoperationen
(C++11)    

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


 
 
Definiert in Header <memory>
Aufrufsignatur
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 gegebenen 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.

Die auf dieser Seite beschriebenen funktionsartigen Entitäten sind Algorithmus-Funktionsobjekte (informell als Niebloids bekannt), das heißt:

Parameter

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

Rückgabewert

location

Hinweise

std::ranges::construct_at verhält sich genauso wie std::construct_at , mit der Ausnahme, dass es für argumentabhängige Suche unsichtbar ist.

Beispiel

#include <iostream>
#include <memory>
struct S
{
    int x;
    float y;
    double z;
    S(int x, float y, double z) : x{x}, y{y}, z{z} { std::cout << "S::S();\n"; }
    ~S() { std::cout << "S::~S();\n"; }
    void print() const
    {
        std::cout << "S { x=" << x << "; y=" << y << "; z=" << z << "; };\n";
    }
};
int main()
{
    alignas(S) unsigned char buf[sizeof(S)];
    S* ptr = std::ranges::construct_at(reinterpret_cast<S*>(buf), 42, 2.71828f, 3.1415);
    ptr->print();
    std::ranges::destroy_at(ptr);
}

Ausgabe:

S::S();
S { x=42; y=2.71828; z=3.1415; };
S::~S();

Fehlerberichte

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

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

Siehe auch

zerstört ein Objekt an einer gegebenen Adresse
(Algorithmus-Funktionsobjekt)
erzeugt ein Objekt an einer gegebenen Adresse
(Funktionstemplate)