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,
|
(6) | (C++23以降) |
|
template
<
class
T
>
volatile
T
*
start_lifetime_as_array
(
volatile
void
*
p,
|
(7) | (C++23以降) |
|
template
<
class
T
>
const
volatile
T
*
start_lifetime_as_array
(
const
volatile
void
*
p,
|
(8) | (C++23以降) |
T
の完全なオブジェクト(そのアドレスが
p
であるもの)と、その内部にネストされたオブジェクト。作成された各オブジェクト
obj
の値(
TriviallyCopyable
型
U
である場合)は、
std::
bit_cast
<
U
>
(
E
)
の呼び出しと同様の方法で決定されるが、実際にはストレージにアクセスされない。ここで
E
は
obj
を表す型
U
の左辺値である。それ以外の場合、そのような作成されたオブジェクトの値は未規定である。
-
Tは ImplicitLifetimeType であり、 完全型 でなければならない。それ以外の場合、プログラムは不適格である。 - 以下の場合、動作は未定義である:
-
-
[p,( char * ) p + sizeof ( T ))が、 p を通じて到達可能なストレージ領域の部分集合である割り当て済みストレージ領域を表さない場合、または -
その領域が
Tに対して適切にアラインされていない場合。
-
- 未規定の値は不定値である可能性があることに注意。
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 を通じて到達可能な記憶域の領域の部分集合である割り当て済み記憶域の領域を示さない場合。
-
非nullの
p
が
目次 |
パラメータ
| p | - | オブジェクトで構成される領域のアドレス |
| n | - | 作成する配列の要素数 |
戻り値
注記
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
をその基底バイト列のビューに変換する
(関数テンプレート) |