- memory[meta header]
- std[meta namespace]
- allocator_traits[meta class]
- function template[meta id-type]
- cpp11[meta cpp]
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);
}
- construct[color ff0000]
- traits::allocate[link allocate.md]
- traits::destroy[link destroy.md]
- traits::deallocate[link deallocate.md]
3, a
- C++11
- Clang: 3.0 [mark verified]
- GCC: 4.7.3 [mark verified]
- ICC: ??
- Visual C++: 2012 [mark verified], 2013 [mark verified]
- 2012までは、可変引数テンプレートに対応していないため、不完全な実装である。