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 obj を表す型 U の左辺値である。それ以外の場合、そのような作成されたオブジェクトの値は未規定である。
  • 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 完全型 でなければなりません。そうでない場合、プログラムは不適格です。
  • 以下の場合、動作は未定義です:
  • 非nullの 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)
ある型のオブジェクト表現を別の型として再解釈する
(関数テンプレート)
span をその基底バイト列のビューに変換する
(関数テンプレート)