Namespaces
Variants

std::uninitialized_value_construct

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジ上のアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割されたレンジ上で)
集合操作 (ソート済みレンジ上で)
マージ操作 (ソート済みレンジ上で)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書的比較操作
順列操作


 
 
ヘッダ <memory>
template< class NoThrowForwardIt >
void uninitialized_value_construct( NoThrowForwardIt first,
                                    NoThrowForwardIt last );
で定義 (1) (C++17以降)
(C++26からconstexpr)
template< class ExecutionPolicy, class NoThrowForwardIt >
void uninitialized_value_construct( ExecutionPolicy&& policy,
                                    NoThrowForwardIt first,
                                    NoThrowForwardIt last );
(2) (C++17以降)
1) 宛先範囲の要素を [first, last) によって 値初期化 で構築します。以下と同様です。

for (; first != last; ++first)
    ::new (voidify(*first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type();

初期化中に例外がスローされた場合、既に構築されたオブジェクトは未規定の順序で破棄されます。
2) (1)と同じですが、policyに従って実行されます。
このオーバーロードは、次の式の値がtrueである場合にのみオーバーロード解決に参加します:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20以降)

パラメータ

first, last - 初期化する要素の範囲を定義するイテレータのペア
policy - 使用する実行ポリシー
型要件
-
NoThrowForwardIt は LegacyForwardIterator の要件を満たさなければならない。
-
NoThrowForwardIt の有効なインスタンスを通じたインクリメント、代入、比較、間接参照は例外をスローしてはならない。

例外

2) 実行プロセス中:
  • 並列化に必要な一時メモリリソースが利用できない場合、std::bad_allocが送出されます。
  • アルゴリズム引数を介してオブジェクトにアクセス中に捕捉されない例外が送出された場合、動作は実行ポリシーによって決定されます(標準ポリシー、std::terminateが呼び出されます)。

ノート

機能テストマクロ 値 標準 機能
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr用特殊化<memory>アルゴリズム、(1)

実装例

template<class NoThrowForwardIt>
constexpr void uninitialized_value_construct(NoThrowForwardIt first,
                                             NoThrowForwardIt last)
{
    using Value = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = first;
    try
    {
        for (; current != last; ++current)
        {
            ::new (static_cast<void*>(std::addressof(*current))) Value();
        }
    }
    catch (...)
    {
        std::destroy(first, current);
        throw;
    }
}

例

#include <iostream>
#include <memory>
#include <string>
int main()
{
    struct S { std::string m{"Default value"}; };
    constexpr int n{3};
    alignas(alignof(S)) unsigned char mem[n * sizeof(S)];
    try
    {
        auto first{reinterpret_cast<S*>(mem)};
        auto last{first + n};
        std::uninitialized_value_construct(first, last);
        for (auto it{first}; it != last; ++it)
            std::cout << it->m << '\n';
        std::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
    // スカラ型の場合、uninitialized_value_constructは
    // 指定された未初期化メモリ領域をゼロ埋めします
    int v[]{1, 2, 3, 4};
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << '\n';
    std::uninitialized_value_construct(std::begin(v), std::end(v));
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}

出力:

Default value
Default value
Default value
1 2 3 4
0 0 0 0

関連項目

開始位置と個数で定義される未初期化メモリ領域で value-initialization によってオブジェクトを構築する
(関数テンプレート)
範囲で定義される未初期化メモリ領域で default-initialization によってオブジェクトを構築する
(関数テンプレート)
範囲で定義される未初期化メモリ領域で value-initialization によってオブジェクトを構築する
(アルゴリズム関数オブジェクト)