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 конструирования
в неинициализированной области памяти, указанной
p
, используя
*
this
в качестве аллокатора.
Эта перегрузка участвует в разрешении перегрузки только если
U
не является специализацией
std::pair
.
(до C++20)
|
2)
Сначала, если либо
T1
, либо
T2
обладает аллокатором, модифицирует кортежи
x
и
y
, чтобы включить
this->resource()
, что приводит к двум новым кортежам
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 | - |
пара, два члена которой являются аргументами конструктора для
T1
и
T2
|
| non_pair | - |
не-
pair
аргумент для преобразования в
pair
для последующего конструирования
|
Возвращаемое значение
(нет)
Примечания
Эта функция вызывается (через
std::allocator_traits
) любым объектом, осведомлённым о распределителях памяти, таким как
std::pmr::vector
(или другим
std::vector
, которому был передан
std::pmr::polymorphic_allocator
в качестве используемого распределителя).
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2969 | C++17 |
uses-allocator construction passed
resource()
|
passes * this |
| LWG 2975 | C++17 | first overload is mistakenly used for pair construction in some cases | constrained to not accept pairs |
| LWG 3525 | C++17 |
no overload could handle non-
pair
types convertible to
pair
|
reconstructing overload added |
Смотрите также
|
[static]
|
создает объект в выделенной памяти
(шаблон функции) |
|
(until C++20)
|
создает объект в выделенной памяти
(публичная функция-член
std::allocator<T>
)
|