最終更新日時(UTC): 2026年01月06日 03時47分59秒
Koichi Murase が更新

履歴 編集

function template
<memory>

# std::uninitialized_value_construct_n(C++17)

    namespace std {
      template <class ForwardIterator, class Size>
      ForwardIterator
        uninitialized_value_construct_n(ForwardIterator first,
                                        Size n); // (1) C++17
      template <class ForwardIterator, class Size>
      constexpr ForwardIterator
        uninitialized_value_construct_n(ForwardIterator first,
                                        Size n); // (1) C++26

      template <class ExecutionPolicy, class ForwardIterator, class Size>
      ForwardIterator
        uninitialized_value_construct_n(ExecutionPolicy&& exec,
                                        ForwardIterator first,
                                        Size n); // (2) C++17
    }

## 概要

未初期化領域の範囲のうち、先頭N個の要素を値構築する。

未初期化領域の入力イテレータ範囲`[first, first + n)`の各要素を値構築する (ゼロ初期化する)。

## 効果

以下と等価：

    for (; n > 0; (void)++first, --n)
      ::new (static_cast<void*>(addressof(*first)))
        typename iterator_traits<ForwardIterator>::value_type();
    return first;

## 例外

呼び出すコンストラクタなどから例外が送出された場合、その例外がこの関数の外側に伝播される前に、その時点で構築済のオブジェクトは全て未規定の順序で破棄される。すなわち、例外が送出された場合は初期化対象領域は未初期化のままとなる。

### 例

    #include <iostream>
    #include <memory>

    struct Vector {
      int x, y;
    };

    int main()
    {
      std::allocator<Vector> alloc;

      // メモリ確保。
      // この段階では、[p, p + size)の領域は未初期化
      const std::size_t size = 3;
      Vector* p = alloc.allocate(size);

      // 未初期化領域[p, p + size)を値構築
      std::uninitialized_value_construct_n(p, size);

      // 各要素を出力
      for (std::size_t i = 0; i < size; ++i) {
        const Vector& v = *(p + i);
        std::cout << v.x << ',' << v.y << std::endl;
      }

      // オブジェクトを破棄
      std::destroy(p, p + size);

      // メモリ解放
      alloc.deallocate(p, size);
    }

### 出力例

    0,0
    0,0
    0,0

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- Visual C++: ??

## 関連項目

- `ranges::uninitialized_value_construct_n`

## 参照

- P0040R3 Extending memory management tools
- P3508R0 Wording for "constexpr for specialized memory algorithms"
  - C++26から`constexpr`がついた