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,
std::size_t n ) noexcept;
| (6) | (начиная с C++23) |
template< class T >
volatile T* start_lifetime_as_array( volatile void* p,
std::size_t n ) noexcept;
| (7) | (начиная с C++23) |
template< class T >
const volatile T* start_lifetime_as_array( const volatile void* p,
std::size_t n ) noexcept;
| (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. - Обратите внимание, что неопределённое значение может быть неопределённым (indeterminate).
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 | - | адрес области, состоящей из объектов |
| n | - | число элементов создаваемого массива |
Возвращаемое значение
1-4) Указатель на полный объект, описанный выше.
5-8) Указатель на первый элемент созданного массива, если он существует; в противном случае — указатель, сравниваемый на равенство с
p.Примечания
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) | интерпретирует представление объекта одного типа как представление объекта другого типа (шаблон функции) |
|
(C++20) | преобразует span в представление содержащихся в нём байтов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/start_lifetime_as