std:: construct_at
|
Definiert im 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.
Entspricht
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
verwendet werden kann
(bis C++26)
.
Wenn
construct_at
in der Auswertung eines konstanten Ausdrucks
expr
aufgerufen wird, muss
location
entweder auf einen Speicherbereich zeigen, der durch
std::
allocator
<
T
>
::
allocate
erhalten wurde, oder auf ein Objekt, dessen Lebensdauer innerhalb der Auswertung von
expr
begann.
Diese Überladung nimmt nur dann 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.
Inhaltsverzeichnis |
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 | Korrektes Verhalten |
|---|---|---|---|
| LWG 3436 | C++20 |
construct_at
konnte keine Objekte von Array-Typen erzeugen
|
kann begrenzte Arrays wertinitialisieren |
| LWG 3870 | C++20 |
construct_at
konnte Objekte von cv-qualifizierten Typen erzeugen
|
nur cv-unqualifizierte Typen sind erlaubt |
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) |
|
(C++20)
|
erstellt ein Objekt an einer gegebenen Adresse
(Algorithmus-Funktionsobjekt) |