std::pmr::polymorphic_allocator<T>:: construct
|
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,
|
(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 を構築されたオブジェクトに渡します。
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
<>
(
)
)
。つまり、メンバ型がメモリリソースを受け入れる場合、それをペアのメンバ型に引き渡す。
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)))
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>
の公開メンバ関数)
|