名前空間
変種
操作

std::experimental::pmr::polymorphic_allocator<T>::construct

From cppreference.com
 
 
 
 
 
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,
                std::piecewise_construct_t,
                std::tuple<Args1...> x,

                std::tuple<Args2...> y );
(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)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, const std::pair<U, V>& xy );
(5) (Library Fundamentals TS)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, std::pair<U, V>&& xy );
(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のいずれかがアロケータ対応である場合、タプルxythis->resource()を含むように変更し、以下の3つの規則に従って2つの新しいタプルxprimeyprimeを生成します。

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)、xprimestd::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)、xprimestd::tuple_cat(std::move(x), std::make_tuple(this->resource()))となります。

2d) それ以外の場合、プログラムは不定形(ill-formed)となります。

T2yからyprimeへの置き換えにも同様の規則が適用されます。

xprimeyprimeが生成された後、確保されたストレージ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つのメンバーが T1T2 のコンストラクタ引数であるペア

[編集] 戻り値

(なし)

[編集] 注記

この関数は、アロケータとしてstd::polymorphic_allocatorを受け取ったstd::vectorなどのアロケータ対応オブジェクトによって(std::allocator_traitsを介して)呼び出されます。memory_resource*polymorphic_allocatorに暗黙的に変換されるため、メモリリソースポインタは、ポリモーフィックアロケータを使用するすべてのアロケータ対応サブオブジェクトに伝播します。

[編集] 関連項目

[static]
割り当てられたストレージにオブジェクトを構築する
(関数テンプレート) [編集]
(C++20まで)
割り当てられたストレージにオブジェクトを構築する
(std::allocator<T> のパブリックメンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)