Spec-Zone.ru › C++

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)
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.
  • Обратите внимание, что неопределённое значение может быть неопределённым (indeterminate).
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]

См. также

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/cpp/memory/start_lifetime_as

Spec-Zone.ru

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