名稱空間
變體
操作

std::start_lifetime_as, std::start_lifetime_as_array

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫

分配器
記憶體資源
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
start_lifetime_asstart_lifetime_as_array
(C++23)(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)及其內部巢狀物件。每個所建立的 可平凡複製 (TriviallyCopyable) 型別 U 的物件 obj 的值,以與呼叫 std::bit_cast<U>(E) 相同的方式確定,但儲存空間不會實際訪問,其中 E 是表示 obj 的型別 U 的左值。否則,此類建立物件的值是未指定的。
  • [p(char*)p + sizeof(T)) 所指示的已分配儲存區域不是透過 p 可達的儲存區域的子集,或
  • 該區域未針對 T 進行適當對齊。
  • 注意,未指定值可能是未確定值。
5-8) 隱式地建立一個元素型別為 T 且長度為 n 的陣列。準確地說,如果 n > 0true,則它等價於 std::start_lifetime_as<U>(p),其中 U 是型別“nT 的陣列”。否則,函式無效果。
  • 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]

[編輯] 參閱

(C++20)
將一種型別的物件表示重新解釋為另一種型別的物件表示
(函式模板) [編輯]
將 `span` 轉換為其底層位元組的檢視
(函式模板) [編輯]