Namespaces
Variants

std:: start_lifetime_as, std:: start_lifetime_as_array

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Explicit lifetime management
start_lifetime_as
(C++23)
start_lifetime_as_array
(C++23)
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовочном файле <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)
1-4) Неявно создаёт полный объект типа T (чей адрес равен p ) и вложенные в него объекты. Значение каждого созданного объекта obj типа TriviallyCopyable U определяется так же, как при вызове std:: bit_cast < U > ( E ) за исключением того, что доступ к памяти фактически не выполняется, где E является lvalue типа U , обозначающим obj . В противном случае значения таких созданных объектов не определены.
  • [ p , ( char * ) p + sizeof ( T ) ) не обозначает область выделенной памяти, являющуюся подмножеством области памяти, доступной через p , или
  • область не имеет подходящего выравнивания для T .
  • Обратите внимание, что неопределённое значение может быть недетерминированным.
5-8) Неявно создаёт массив с типом элементов 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)
переинтерпретирует представление объекта одного типа как представление другого типа
(function template)
преобразует span в представление его базовых байтов
(function template)