Namespaces
Variants

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

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(注:指定されたテキストブロックには翻訳対象となる可読テキストが含まれていないため、HTML構造はそのまま保持されています)
template < class U, class ... Args >
void construct ( U * p, Args && ... args ) ;
(1) (C++17以降)
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) (C++17以降)
(C++20まで)
template < class T1, class T2 >
void construct ( std:: pair < T1, T2 > * p ) ;
(3) (C++17以降)
(C++20まで)
template < class T1, class T2, class U, class V >
void construct ( std:: pair < T1, T2 > * p, U && x, V && y ) ;
(4) (C++17以降)
(C++20まで)
template < class T1, class T2, class U, class V >
void construct ( std:: pair < T1, T2 > * p, const std:: pair < U, V > & xy ) ;
(5) (C++17以降)
(C++20まで)
template < class T1, class T2, class U, class V >
void construct ( std:: pair < T1, T2 > * p, std:: pair < U, V > && xy ) ;
(6) (C++17以降)
(C++20まで)
template < class T1, class T2, class NonPair >
void construct ( std:: pair < T1, T2 > * p, NonPair && non_pair ) ;
(7) (C++17以降)
(C++20まで)

割り当て済みだが初期化されていないストレージ内にオブジェクトを構築します。ストレージは p が指し、提供されたコンストラクタ引数を使用します。オブジェクトがそれ自身アロケータを使用する型である場合、またはstd::pairである場合、 * this を構築されたオブジェクトに渡します。

1) 指定された型 U のオブジェクトを、 uses-allocator construction によって、 p で示される未初期化メモリ位置に、 * this をアロケータとして使用して生成します。 このオーバーロードは、 U std::pair の特殊化でない場合にのみオーバーロード解決に参加します。 (C++20以前)
2) まず、 T1 または T2 のいずれかがアロケータ対応である場合、以下の3つのルールに従って、タプル x y を修正し、 this->resource() を含む2つの新しいタプル xprime yprime を生成します:
2a) T1 がアロケータ対応でない場合( std:: uses_allocator < T1, polymorphic_allocator > :: value == false )かつ std:: is_constructible < T1, Args1... > :: value == true の場合、 xprime は変更されていない x となります。
2b) T1 がアロケータ対応 ( std:: uses_allocator < T1, polymorphic_allocator > :: value == true ) であり、かつそのコンストラクタがアロケータタグを受け取る場合 ( std:: is_constructible < T1, std:: allocator_arg_t , polymorphic_allocator, Args1... > :: value == true )、その場合 xprime std:: tuple_cat ( std:: make_tuple ( std:: allocator_arg , * this ) , std :: move ( x ) ) となる。
2c) T1 がアロケータ対応( std:: uses_allocator < T1, polymorphic_allocator > :: value == true )であり、かつそのコンストラクタが最後の引数としてアロケータを受け取る場合( std:: is_constructible < T1, Args1..., polymorphic_allocator > :: value == true )、 xprime std:: tuple_cat ( std :: move ( x ) , std:: make_tuple ( * this ) ) となります。
2d) それ以外の場合、プログラムは不適格である。
同じルールが T2 y yprime への置換に適用されます。
xprime yprime が構築された後、割り当てられたストレージ内にペア p を以下のように構築する: :: 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 <> ( ) ) 。つまり、メンバ型がメモリリソースを受け入れる場合、それをペアのメンバ型に引き渡す。
5) 次と同等
6) 次と同等
7) このオーバーロードは、説明専用の関数テンプレート
template< class A, class B >
void /*deduce-as-pair*/( const std::pair<A, B>& );

が与えられた場合にのみ、オーバーロード解決に参加します。 /*deduce-as-pair*/ ( non_pair ) は、未評価オペランドとして考慮された場合に不適格となります。以下と等価です:

construct<T1, T2, T1, T2>(p, std::forward<NonPair>(non_pair));
(C++20まで)

目次

パラメータ

p - 確保済みだが初期化されていないストレージへのポインタ
args... - T のコンストラクタに渡すコンストラクタ引数
x - T1 のコンストラクタに渡すコンストラクタ引数
y - T2 のコンストラクタに渡すコンストラクタ引数
xy - 2つのメンバーがそれぞれ T1 T2 のコンストラクタ引数となるペア
non_pair - さらに構築するために pair に変換する非 pair 引数

戻り値

(なし)

注記

この関数は( std::allocator_traits を通じて)アロケータ対応オブジェクト、例えば std::pmr::vector (またはアロケータとして std::pmr::polymorphic_allocator が指定された他の std::vector )によって呼び出されます。

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2969 C++17 uses-allocator構築で resource() を渡していた * this を渡す
LWG 2975 C++17 一部の場合でpair構築に誤って最初のオーバーロードが使用されていた pairを受け入れないように制約を追加
LWG 3525 C++17 pair に変換可能な非 pair 型を扱えるオーバーロードが存在しなかった 再構築オーバーロードを追加

関連項目

[static]
割り当てられたストレージ内にオブジェクトを構築する
(関数テンプレート)
(until C++20)
割り当てられたストレージ内にオブジェクトを構築する
( std::allocator<T> の公開メンバ関数)