Spec-Zone.ru › C++

std::start_lifetime_as, std::start_lifetime_as_array

Определено в заголовке <memory>
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)
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. В противном случае значения созданных объектов не определены.
  • T должен быть типом ImplicitLifetimeType и полным типом полного типа. В противном случае программа некорректна.
  • Поведение неопределено, если:
    • [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 обрабатывает массивы с неизвестной длиной.

Макрокоманда проверки наличия функции Значение Std Функция
__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 d = *std::launder(reinterpret_cast<std::complex<float>*>(network_data));
//  std::cout << d << '\n'; // Possible UB, related to CWG1997:
//      the implicitly created complex<float> may hold indeterminate value
 
    auto d = *std::start_lifetime_as<std::complex<float>>(network_data);
    std::cout << d << '\n'; // OK
}

Возможный вывод:

(0.1,0.2)

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2023):
    • 20.2.6 Явное управление временем жизни [obj.lifetime]

См. также

bit_cast
(C++20)
Переинтерпретация представления объекта одного типа как представления другого
(шаблон функции)
as_bytesas_writable_bytes
(C++20)
Преобразование span в представление её подлежащих байтов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/start_lifetime_as

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API