Namespaces
Variants

std::uninitialized_default_construct_n

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に対するアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy、ranges::sort、...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対して)
集合操作(ソート済み範囲に対して)
マージ操作(ソート済み範囲に対して)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書式比較操作
順列操作


 
 
ヘッダ <memory>
template< class NoThrowForwardIt, class Size >
NoThrowForwardIt uninitialized_default_construct_n
    ( NoThrowForwardIt first, Size count );
で定義 (1) (C++17以上)
(C++26以降constexpr)
template< class ExecutionPolicy, class NoThrowForwardIt, class Size >
NoThrowForwardIt uninitialized_default_construct_n
    ( ExecutionPolicy&& policy, NoThrowForwardIt first, Size count );
(2) (C++17以上)
1) 宛先範囲 first + [0, count) の要素を デフォルト初期化 によって構築する。あたかも次のように行われる:

for (; count > 0; (void)++first, --count)
    ::new (voidify(*first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type;
return first;

初期化中に例外が投げられた場合、既に構築されたオブジェクトは未規定の順序で破棄される。
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 - 初期化する要素範囲の先頭
count - 構築する要素の数
policy - 使用する 実行ポリシー
型要件
-
NoThrowForwardIt は LegacyForwardIterator の要件を満たさなければならない
-
NoThrowForwardIt の有効なインスタンスを通じたインクリメント、代入、比較、間接参照は例外をスローしてはならない

戻り値

上記の通り。

例外

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

注釈

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

実装例

template<class NoThrowForwardIt, class Size>
constexpr ForwardIt uninitialized_default_construct_n(NoThrowForwardIt first, Size count)
{
    using T = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = first;
    try
    {
        for (; countn > 0; (void) ++current, --count)
            ::new (static_cast<void*>(std::addressof(*current))) T;
        return current;
    }
    catch (...)
    {
        std::destroy(first, current);
        throw;
    }
}
**注記**: 提供されたコードはC++のテンプレート関数`uninitialized_default_construct_n`の実装であり、HTMLタグ内の`
`ブロックに含まれているため、翻訳対象外です。HTML構造とC++コードは完全に保持されています。

例

#include <cstring>
#include <iostream>
#include <memory>
#include <string>
struct S
{
    std::string m{"default value"};
};
int main()
{
    constexpr int n{3};
    alignas(alignof(S)) unsigned char mem[n * sizeof(S)];
    try
    {
        auto first{reinterpret_cast<S*>(mem)};
        auto last = std::uninitialized_default_construct_n(first, n);
        for (auto it{first}; it != last; ++it)
            std::cout << it->m << '\n';
        std::destroy(first, last);
    }
    catch(...)
    {
        std::cout << "Exception!\n";
    }
    // スカラ型の場合、uninitialized_default_construct_nは
    // 一般的に指定された未初期化メモリ領域をゼロ初期化しません
    int v[]{1, 2, 3, 4};
    const int original[]{1, 2, 3, 4};
    std::uninitialized_default_construct_n(std::begin(v), std::size(v));
    // vへのアクセスは未定義動作となる可能性があります
    // CWG 1997の解決待ち:
    // for (const int i : v)
    //     std::cout << i << ' ';
    // 結果は未規定:
    std::cout << (std::memcmp(v, original, sizeof(v)) == 0 ? "un" : "") << "modified\n";
}

出力例:

default value
default value
default value
unmodified

関連項目

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