std::experimental::pmr::polymorphic_allocator<T>::construct
| template< class U, class... Args > void construct( U* p, Args&&... args ); |
(1) | (Library Fundamentals TS) |
| template< class T1, class T2, class... Args1, class... Args2 > void construct( std::pair<T1, T2>* p, |
(2) | (Library Fundamentals TS) |
| template< class T1, class T2 > void construct( std::pair<T1, T2>* p ); |
(3) | (Library Fundamentals TS) |
| template< class T1, class T2, class U, class V > void construct( std::pair<T1, T2>* p, U&& x, V&& y ); |
(4) | (Library Fundamentals TS) |
| (5) | (Library Fundamentals TS) | |
| (6) | (Library Fundamentals TS) | |
確保されたストレージ(ただし初期化はされていない)pの指す先に、指定されたコンストラクタ引数を用いてオブジェクトを構築します。構築されるオブジェクトがそれ自体アロケータを使用する型である場合、またはstd::pairである場合、構築されるオブジェクトにthis->resource()を渡します。
1) もしstd::uses_allocator<U, memory_resource*>::value == false(型Uはアロケータを使用しない)であり、かつstd::is_constructible<U, Args...>::value == trueであれば、オブジェクトは::new((void *) p) U(std::forward<Args>(args)...);のように構築されます。
そうでなく、もしstd::uses_allocator<U, memory_resource*>::value == true(型Uはアロケータを使用する、例えばコンテナである)であり、かつstd::is_constructible<U, std::allocator_arg_t, memory_resource*, Args...>::value == trueであれば、オブジェクトは::new((void *) p) U(std::allocator_arg, this->resource(), std::forward<Args>(args)...);のように構築されます。
そうでなく、もしstd::uses_allocator<U, memory_resource*>::value == true(型Uはアロケータを使用する、例えばコンテナである)であり、かつstd::is_constructible<U, Args..., memory_resource*>::value == trueであれば、オブジェクトは::new((void *) p) U(std::forward<Args>(args)..., this->resource());のように構築されます。
それ以外の場合、プログラムは不適格となります。
2) まず、T1またはT2のいずれかがアロケータ対応である場合、タプルxとyをthis->resource()を含むように変更し、以下の3つの規則に従って2つの新しいタプルxprimeとyprimeを生成します。
2a) もしT1がアロケータ非対応(std::uses_allocator<T1, memory_resource*>::value == false)であり、かつstd::is_constructible<T1, Args1...>::value == trueであれば、xprimeは変更されないxとなります。
2b) もしT1がアロケータ対応(std::uses_allocator<T1, memory_resource*>::value == true)であり、かつそのコンストラクタがアロケータタグを受け取る場合(std::is_constructible<T1, std::allocator_arg_t, memory_resource*, Args1...>::value == true)、xprimeはstd::tuple_cat(std::make_tuple(std::allocator_arg, this->resource()), std::move(x))となります。
2c) もしT1がアロケータ対応(std::uses_allocator<T1, memory_resource*>::value == true)であり、かつそのコンストラクタがアロケータを最後の引数として受け取る場合(std::is_constructible<T1, Args1..., memory_resource*>::value == true)、xprimeはstd::tuple_cat(std::move(x), std::make_tuple(this->resource()))となります。
2d) それ以外の場合、プログラムは不定形(ill-formed)となります。
T2とyからyprimeへの置き換えにも同様の規則が適用されます。
xprimeとyprimeが生成された後、確保されたストレージpにペアpair<T1, T2>を、::new((void *) p) pair<T1, T2>(std::piecewise_construct, std::move(xprime), std::move(yprime));のように構築します。
3) construct(p, std::piecewise_construct, std::tuple<>(), std::tuple<>())と同等です。つまり、メモリリソースをペアのメンバ型(それらが受け入れる場合)に渡します。
4) 同等:
construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(x)),
std::forward_as_tuple(std::forward<V>(y)))
5) 同等:
construct(p, std::piecewise_construct, std::forward_as_tuple(xy.first),
std::forward_as_tuple(xy.second))
6) 同等:
construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(xy.first)),
std::forward_as_tuple(std::forward<V>(xy.second)))
目次 |
[編集] パラメータ
| p | - | 割り当てられているが初期化されていないストレージへのポインタ |
| args... | - | T のコンストラクタに渡すコンストラクタ引数 |
| x | - | T1 のコンストラクタに渡すコンストラクタ引数 |
| y | - | T2 のコンストラクタに渡すコンストラクタ引数 |
| xy | - | 2つのメンバーが T1 と T2 のコンストラクタ引数であるペア |
[編集] 戻り値
(なし)
[編集] 注記
この関数は、アロケータとしてstd::polymorphic_allocatorを受け取ったstd::vectorなどのアロケータ対応オブジェクトによって(std::allocator_traitsを介して)呼び出されます。memory_resource*はpolymorphic_allocatorに暗黙的に変換されるため、メモリリソースポインタは、ポリモーフィックアロケータを使用するすべてのアロケータ対応サブオブジェクトに伝播します。
[編集] 関連項目
| [static] |
割り当てられたストレージにオブジェクトを構築する (関数テンプレート) |
| (C++20まで) |
割り当てられたストレージにオブジェクトを構築する ( std::allocator<T> のパブリックメンバ関数) |