std::start_lifetime_as, std::start_lifetime_as_array
來自 cppreference.com
定義於標頭檔案 <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 起) |
1-4) 隱式地建立一個型別為
T
的完整物件(其地址為 p)及其內部巢狀物件。每個所建立的 可平凡複製 (TriviallyCopyable) 型別 U
的物件 obj
的值,以與呼叫 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
應為完整型別。否則,程式非良構。 - 若出現以下情況,行為未定義:
- 非空 p 未針對
T
的陣列進行適當對齊,或 - n <= std::size_t(-1) / sizeof(T) 為 false,或
- n > 0 且
[
(char*)p,
(char*)p + (n * sizeof(T)))
所指示的已分配儲存區域不是透過 p 可達的儲存區域的子集。
- 非空 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) |
將一種型別的物件表示重新解釋為另一種型別的物件表示 (函式模板) |
(C++20) |
將 `span` 轉換為其底層位元組的檢視 (函式模板) |