最終更新日時: 2025年08月31日 19時06分36秒 (JST)
Raclamusi が更新

履歴 編集

function template
<memory>

# std::allocator_traits::construct(C++11)

    template <class T, class... Args>
    static void construct(Alloc& a, T* p, Args&&... args);              // C++17 まで
    template <class T, class... Args>
    static constexpr void construct(Alloc& a, T* p, Args&&... args);    // C++20 から

## 概要

引数を元にインスタンスを構築する。

## 効果

- C++17 まで `a.construct(p, forward<Args>(args)...)` という式が有効ならそれを呼び出し、そうでなければデフォルト実装として `::new(static_cast<void*>(p)) T(forward<Args>(args)...)` を呼び出す。
- C++20 から `a.construct(p, forward<Args>(args)...)` という式が有効ならそれを呼び出し、そうでなければデフォルト実装として `construct_at(p, forward<Args>(args)...)`を呼び出す。

## 戻り値

なし

## 例

    #include <iostream>
    #include <memory>
    #include <utility>

    int main()
    {
      using value_type = std::pair<int, char>;
      std::allocator<value_type> alloc;
      using traits = std::allocator_traits<decltype(alloc)>;

      std::size_t n = 1;
      value_type* p = traits::allocate(alloc, n);

      // メモリ領域にpairオブジェクトを構築
      traits::construct(alloc, p, 3, 'a');

      std::cout << p->first << ", " << p->second << std::endl;

      traits::destroy(alloc, p);
      traits::deallocate(alloc, p, n);
    }

### 出力

    3, a

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.7.3 ✅
- ICC: ??
- Visual C++: 2012 ✅, 2013 ✅
  - 2012までは、可変引数テンプレートに対応していないため、不完全な実装である。

## 参照

- P0784R7 More constexpr containers