std::experimental::pmr::polymorphic_allocator<T>:: construct
|
template
<
class
U,
class
...
Args
>
void construct ( U * p, Args && ... args ) ; |
(1) | (TS библиотечных основ) |
|
template
<
class
T1,
class
T2,
class
...
Args1
,
class
...
Args2
>
void
construct
(
std::
pair
<
T1, T2
>
*
p,
|
(2) | (TS библиотечных основ) |
|
template
<
class
T1,
class
T2
>
void construct ( std:: pair < T1, T2 > * p ) ; |
(3) | (TS библиотечных основ) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, U && x, V && y ) ; |
(4) | (TS библиотечных основ) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, const std:: pair < U, V > & xy ) ; |
(5) | (TS библиотечных основ) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, std:: pair < U, V > && xy ) ; |
(6) | (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()
, получая два новых кортежа
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) В противном случае программа является некорректно сформированной.
Те же правила применяются к
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
)
)
)
Содержание |
Параметры
| p | - | указатель на выделенную, но не инициализированную память |
| args... | - |
аргументы конструктора для передачи конструктору
T
|
| x | - |
аргументы конструктора для передачи конструктору
T1
|
| y | - |
аргументы конструктора для передачи конструктору
T2
|
| xy | - |
пара, два элемента которой являются аргументами конструктора для
T1
и
T2
|
Возвращаемое значение
(нет)
Примечания
Эта функция вызывается (через
std::allocator_traits
) любым объектом с поддержкой аллокатора, таким как
std::vector
, которому был передан
std::polymorphic_allocator
в качестве используемого аллокатора. Поскольку
memory_resource*
неявно преобразуется в
polymorphic_allocator
, указатель на ресурс памяти будет распространяться на любые подобъекты с поддержкой аллокатора, использующие полиморфные аллокаторы.
Смотрите также
|
[static]
|
создает объект в выделенной памяти
(шаблон функции) |
|
(до C++20)
|
создает объект в выделенной памяти
(публичная функция-член
std::allocator<T>
)
|