std:: start_lifetime_as, std:: start_lifetime_as_array
|
Определено в заголовочном файле
<memory>
|
||
std::start_lifetime_as
|
||
|
template
<
class
T
>
T * start_lifetime_as ( void * p ) noexcept ; |
(1) | (начиная с C++23) |
|
template
<
class
T
>
const T * start_lifetime_as ( const void * p ) noexcept ; |
(2) | (начиная с C++23) |
|
template
<
class
T
>
volatile T * start_lifetime_as ( volatile void * p ) noexcept ; |
(3) | (начиная с C++23) |
|
template
<
class
T
>
const volatile T * start_lifetime_as ( const volatile void * p ) noexcept ; |
(4) | (начиная с C++23) |
std::start_lifetime_as_array
|
||
|
template
<
class
T
>
T * start_lifetime_as_array ( void * p, std:: size_t n ) noexcept ; |
(5) | (начиная с C++23) |
|
template
<
class
T
>
const
T
*
start_lifetime_as_array
(
const
void
*
p,
|
(6) | (начиная с C++23) |
|
template
<
class
T
>
volatile
T
*
start_lifetime_as_array
(
volatile
void
*
p,
|
(7) | (начиная с C++23) |
|
template
<
class
T
>
const
volatile
T
*
start_lifetime_as_array
(
const
volatile
void
*
p,
|
(8) | (начиная с C++23) |
T
(чей адрес равен
p
) и вложенные в него объекты. Значение каждого созданного объекта
obj
типа
TriviallyCopyable
U
определяется так же, как при вызове
std::
bit_cast
<
U
>
(
E
)
за исключением того, что доступ к памяти фактически не выполняется, где
E
является lvalue типа
U
, обозначающим
obj
. В противном случае значения таких созданных объектов не определены.
-
Tдолжен быть ImplicitLifetimeType и должен быть полным типом . В противном случае программа некорректна. - Поведение не определено, если:
-
-
[p,( char * ) p + sizeof ( T ))не обозначает область выделенной памяти, являющуюся подмножеством области памяти, доступной через p , или -
область не имеет подходящего выравнивания для
T.
-
- Обратите внимание, что неопределённое значение может быть недетерминированным.
T
и длиной
n
. Если быть точным, если
n
>
0
равно
true
, это эквивалентно
std
::
start_lifetime_as
<
U
>
(
p
)
, где
U
— это тип "массив из
n
T
". В противном случае функция не имеет эффектов.
-
Tдолжен быть полным типом . В противном случае программа является некорректной. - Поведение не определено, если:
-
-
Ненулевой
p
не подходящим образом выровнен для массива из
T, или - n <= std:: size_t ( - 1 ) / sizeof ( T ) равно false , или
-
n
>
0
и
[( char * ) p,( char * ) p + ( n * sizeof ( T ) ))не обозначает область выделенной памяти, которая является подмножеством области памяти, доступной через p .
-
Ненулевой
p
не подходящим образом выровнен для массива из
Содержание |
Параметры
| p | - | адрес области, содержащей объекты |
| n | - | количество элементов массива для создания |
Возвращаемое значение
Примечания
new
(
void_ptr
)
unsigned
char
[
size
]
или
new
(
void_ptr
)
std::
byte
[
size
]
работает как нетипизированная версия
std::start_lifetime_as
, но не сохраняет представление объекта.
std :: start_lifetime_as работает с не-массивными типами, а также с массивами известной границы, тогда как std :: start_lifetime_as_array обрабатывает массивы неизвестной границы.
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_start_lifetime_as
|
202207L
|
(C++23) | Явное управление временем жизни |
Пример
#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 }
Возможный вывод:
(0.1,0.2)
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 20.2.6 Явное управление временем жизни [obj.lifetime]
Смотрите также
|
(C++20)
|
переинтерпретирует представление объекта одного типа как представление другого типа
(function template) |
|
(C++20)
|
преобразует
span
в представление его базовых байтов
(function template) |