最終更新日時(UTC):
が更新

履歴 編集

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までは、可変引数テンプレートに対応していないため、不完全な実装である。

参照