- memory[meta header]
- std[meta namespace]
- allocator[meta class]
- function[meta id-type]
- cpp17deprecated[meta cpp]
- cpp20removed[meta cpp]
// C++03
void construct(pointer p, const T& val);
// C++11
template <class U, class... Args>
void construct(U* p, Args&&... args);
この関数は、C++17から非推奨となり、C++20で削除された。代わりにstd::allocator_traits
::
construct()
関数を使用すること。
引数を元にインスタンスを構築する。
- C++03 :
new((void *)p) T(val)
- C++11 :
::new((void *)p) U(
std::forward
<Args>(args)...)
なし
多くのメンバ関数は、アロケータの実装によらず、共通に定義できるものだった。そのため、アロケータの中間インタフェースであるstd::allocator_traits
クラスに、共通のデフォルト実装を定義することとなった。
特殊なアロケータの実装では、この関数を独自に実装する必要があるかもしれない。その場合はstd::allocator_traits
のデフォルト機能を使用せずに、この関数を独自アロケータのインタフェースとして定義すれば、std::allocator_traits
クラスを介してインタフェースにアクセスしたとしても、その独自実装が使用される。
少なくとも、std::allocator
クラスのあらゆる標準ライブラリの実装において、この関数は特殊な動作をする必要がないため、std::allocator_traits
クラスのデフォルト実装に任せることとなった。
#include <iostream>
#include <memory>
#include <utility>
int main()
{
using value_type = std::pair<int, char>;
std::allocator<value_type> alloc;
std::size_t n = 1;
value_type* p = alloc.allocate(n);
// メモリ領域にpairオブジェクトを構築
alloc.construct(p, 3, 'a');
std::cout << p->first << ", " << p->second << std::endl;
alloc.destroy(p);
alloc.deallocate(p, n);
}
- construct[color ff0000]
- alloc.allocate[link allocate.md]
- alloc.destroy[link destroy.md]
- alloc.deallocate[link deallocate.md]
3, a
- Clang: 3.0 [mark verified]
- GCC: 4.3.6 [mark verified]
- ICC: ??
- Visual C++: ??