名稱空間
變體
操作

std::ranges::construct_at

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
ranges::construct_at
(C++20)
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*)
顯式生命週期管理
 
定義於標頭檔案 <memory>
呼叫簽名 (Call signature)
template< class T, class... Args >
constexpr T* construct_at( T* location, Args&&... args );
(C++20 起)

在給定地址 location 處構造一個用 args 中的引數初始化的 T 物件。

等價於 if constexpr (std::is_array_v<T>)
    return ::new (voidify (*location)) T[1]();
else
    return ::new (voidify (*location)) T(std::forward<Args>(args)...);
,除了 construct_at 可以用於 常量表達式 的求值(C++26 之前)

當在某個常量表達式 expr 的求值中呼叫 construct_at 時,location 必須指向由 std::allocator<T>::allocate 獲取的儲存,或者一個在 expr 求值期間開始生命週期的物件。

僅當所有以下條件都滿足時,此過載才參與過載決議:

如果 std::is_array_v<T>truesizeof...(Args) 非零,則程式非良構。

本頁描述的類函式實體是 演算法函式物件(非正式地稱為 niebloids),即

目錄

[編輯] 引數

location - 指向將被構造 T 物件的未初始化儲存的指標
args... - 用於初始化的引數

[編輯] 返回值

location

[編輯] 注意

std::ranges::construct_at 的行為與 std::construct_at 完全相同,除了它對於實參依賴查詢是不可見的。

[編輯] 示例

#include <iostream>
#include <memory>
 
struct S
{
    int x;
    float y;
    double z;
 
    S(int x, float y, double z) : x{x}, y{y}, z{z} { std::cout << "S::S();\n"; }
 
    ~S() { std::cout << "S::~S();\n"; }
 
    void print() const
    {
        std::cout << "S { x=" << x << "; y=" << y << "; z=" << z << "; };\n";
    }
};
 
int main()
{
    alignas(S) unsigned char buf[sizeof(S)];
 
    S* ptr = std::ranges::construct_at(reinterpret_cast<S*>(buf), 42, 2.71828f, 3.1415);
    ptr->print();
 
    std::ranges::destroy_at(ptr);
}

輸出

S::S();
S { x=42; y=2.71828; z=3.1415; };
S::~S();

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3436 C++20 construct_at 無法建立陣列型別的物件 可以值初始化有界陣列
LWG 3870 C++20 construct_at 可以建立 cv 限定型別的物件 只允許 cv 非限定型別

[編輯] 參閱

銷燬給定地址處的物件
(演算法函式物件)[編輯]
在給定地址建立物件
(函式模板) [編輯]