std:: start_lifetime_as, std:: start_lifetime_as_array
|
Definiert im Header
<memory>
|
||
std::start_lifetime_as
|
||
|
template
<
class
T
>
T * start_lifetime_as ( void * p ) noexcept ; |
(1) | (seit C++23) |
|
template
<
class
T
>
const T * start_lifetime_as ( const void * p ) noexcept ; |
(2) | (seit C++23) |
|
template
<
class
T
>
volatile T * start_lifetime_as ( volatile void * p ) noexcept ; |
(3) | (seit C++23) |
|
template
<
class
T
>
const volatile T * start_lifetime_as ( const volatile void * p ) noexcept ; |
(4) | (seit C++23) |
std::start_lifetime_as_array
|
||
|
template
<
class
T
>
T * start_lifetime_as_array ( void * p, std:: size_t n ) noexcept ; |
(5) | (seit C++23) |
|
template
<
class
T
>
const
T
*
start_lifetime_as_array
(
const
void
*
p,
|
(6) | (seit C++23) |
|
template
<
class
T
>
volatile
T
*
start_lifetime_as_array
(
volatile
void
*
p,
|
(7) | (seit C++23) |
|
template
<
class
T
>
const
volatile
T
*
start_lifetime_as_array
(
const
volatile
void
*
p,
|
(8) | (seit C++23) |
T
(dessen Adresse
p
ist) und darin verschachtelte Objekte. Der Wert jedes erzeugten Objekts
obj
vom
TriviallyCopyable
-Typ
U
wird auf dieselbe Weise bestimmt wie bei einem Aufruf von
std::
bit_cast
<
U
>
(
E
)
, mit der Ausnahme, dass nicht tatsächlich auf den Speicher zugegriffen wird, wobei
E
der Lvalue vom Typ
U
ist, der
obj
bezeichnet. Andernfalls sind die Werte solcher erzeugten Objekte nicht spezifiziert.
-
Tmuss ein ImplicitLifetimeType sein und muss ein vollständiger Typ sein. Andernfalls ist das Programm fehlerhaft. - Das Verhalten ist undefiniert, wenn:
-
-
[p,( char * ) p + sizeof ( T ))keinen Bereich allokierten Speichers bezeichnet, der eine Teilmenge des durch p erreichbaren Speicherbereichs ist, oder -
der Bereich nicht geeignet für
Tausgerichtet ist.
-
- Beachten Sie, dass der nicht spezifizierte Wert indeterminiert sein kann.
T
und Länge
n
. Genauer gesagt, wenn
n
>
0
true
ist, entspricht dies
std
::
start_lifetime_as
<
U
>
(
p
)
, wobei
U
der Typ "Array von
n
T
s" ist. Andernfalls hat die Funktion keine Auswirkungen.
-
Tmuss ein vollständiger Typ sein. Andernfalls ist das Programm fehlerhaft. - Das Verhalten ist undefiniert, wenn:
-
-
Nicht-null
p
nicht geeignet für ein Array von
Tausgerichtet ist, oder - n <= std:: size_t ( - 1 ) / sizeof ( T ) false ist, oder
-
n
>
0
und
[( char * ) p,( char * ) p + ( n * sizeof ( T ) ))keinen Bereich von allokiertem Speicher bezeichnet, der eine Teilmenge des durch p erreichbaren Speicherbereichs ist.
-
Nicht-null
p
nicht geeignet für ein Array von
Inhaltsverzeichnis |
Parameter
| p | - | die Adresse des Bereichs, der Objekte enthält |
| n | - | die Anzahl der Elemente des zu erstellenden Arrays |
Rückgabewert
Hinweise
new
(
void_ptr
)
unsigned
char
[
size
]
oder
new
(
void_ptr
)
std::
byte
[
size
]
funktioniert als untypisierte Version von
std::start_lifetime_as
, bewahrt jedoch die Objektdarstellung nicht.
std :: start_lifetime_as behandelt sowohl Nicht-Array-Typen als auch Arrays mit bekannter Grenze, während std :: start_lifetime_as_array Arrays mit unbekannter Grenze behandelt.
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_start_lifetime_as
|
202207L
|
(C++23) | Explizite Lebensdauerverwaltung |
Beispiel
#include <complex> #include <iostream> #include <memory> int main() { alignas(std::complex<float>) unsigned char network_data[sizeof(std::complex<float>)] { 0xcd, 0xcc, 0xcc, 0x3d, 0xcd, 0xcc, 0x4c, 0x3e }; // auto d = *reinterpret_cast<std::complex<float>*>(network_data); // std::cout << d << '\n'; // UB: network_data does not point to a complex<float> // auto d1 = *std::launder(reinterpret_cast<std::complex<float>*>(network_data)); // std::cout << d1 << '\n'; // UB: implicitly created objects have dynamic storage // duration and have indeterminate value initially, // even when an array which provides storage for // them has determinate bytes. // See also CWG2721. auto d2 = *std::start_lifetime_as<std::complex<float>>(network_data); std::cout << d2 << '\n'; // OK }
Mögliche Ausgabe:
(0.1,0.2)
Referenzen
- C++23-Standard (ISO/IEC 14882:2024):
-
- 20.2.6 Explizite Lebensdauerverwaltung [obj.lifetime]
Siehe auch
|
(C++20)
|
interpretiert die Objektdarstellung eines Typs als die eines anderen
(Funktionsschablone) |
|
(C++20)
|
konvertiert einen
span
in eine Ansicht seiner zugrundeliegenden Bytes
(Funktionsschablone) |