std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...>:: construct
|
Определено в заголовке
<scoped_allocator>
|
||
|
template
<
class
T,
class
...
Args
>
void construct ( T * p, Args && ... args ) ; |
(1) | |
|
template
<
class
T1,
class
T2,
class
...
Args1
,
class
...
Args2
>
void
construct
(
std::
pair
<
T1, T2
>
*
p,
std::
piecewise_construct_t
,
|
(2) | (до C++20) |
|
template
<
class
T1,
class
T2
>
void construct ( std:: pair < T1, T2 > * p ) ; |
(3) | (до C++20) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, U && x, V && y ) ; |
(4) | (до 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++20) |
|
template
<
class
T1,
class
T2,
class
U,
class
V
>
void construct ( std:: pair < T1, T2 > * p, std:: pair < U, V > && xy ) ; |
(6) | (до C++20) |
|
Вспомогательные шаблоны функций
|
||
|
template
<
class
T,
class
...
Args
>
std:: tuple < /* см. ниже */ > /*concat-args*/ ( std:: tuple < Args... > && tup ) ; |
(7) |
(
только для демонстрации*
)
(до C++20) |
Создаёт объект в выделенной, но не инициализированной памяти, на которую указывает p , используя внешний аллокатор и предоставленные аргументы конструктора. Если объект принадлежит типу, который сам использует аллокаторы , или если это std::pair (до C++20) , передаёт внутренний аллокатор создаваемому объекту.
T
by
конструирование с использованием распределителя
at the uninitialized memory location indicated by
p
using the outermost allocator.
|
Пусть std:: uses_allocator < T, inner_allocator_type > :: value обозначается как uses_inner :
Эта перегрузка участвует в разрешении перегрузки только если
|
(до C++20) |
|
Эквивалентно
std::
apply
|
(начиная с C++20) |
concat-args
<
T1
>
(
std
::
move
(
x
)
)
,
yprime
будет
concat-args
<
T2
>
(
std
::
move
(
y
)
)
, вызывает
outermost-construct
(
p,
std::
piecewise_construct
, std
::
move
(
xprime
)
, std
::
move
(
yprime
)
)
.
std:: forward_as_tuple ( xarg ) , std:: forward_as_tuple ( yarg ) ) ; , где xarg и yarg определены следующим образом:
| Перегрузка | xarg | yarg |
|---|---|---|
| (4) | std:: forward < U > ( x ) | std:: forward < V > ( y ) |
| (5) | xy. first | xy. second |
| (6) | std:: forward < U > ( xy. first ) | std:: forward < V > ( xy. second ) |
T
.
- Если uses_inner равно false и std:: is_constructible < T, Args... > :: value равно true , возвращает std:: tuple < Args && ... > ( std :: move ( tup ) ) .
-
Иначе, если
uses_inner
и
std::
is_constructible
<
T,
std::
allocator_arg_t
,
inner_allocator_type & ,
Args... > :: value оба равны true , возвращает std:: tuple_cat ( std:: tuple < std:: allocator_arg_t , inner_allocator_type & >
( std:: allocator_arg , inner_allocator ( ) ) ,
std:: tuple < Args && ... > ( std :: move ( tup ) ) ) . -
Иначе, если
uses_inner
и
std::
is_constructible
<
T, Args..., inner_allocator_type
&
>
::
value
оба равны
true
, возвращает
std::
tuple_cat
(
std::
tuple
<
Args
&&
...
>
(
std
::
move
(
tup
)
)
,
std:: tuple < inner_allocator_type & > ( inner_allocator ( ) ) . - Иначе программа является некорректной.
Содержание |
Параметры
| p | - | указатель на выделенную, но не инициализированную память |
| args | - |
аргументы конструктора для передачи конструктору
T
|
| x | - |
аргументы конструктора для передачи конструктору
T1
|
| y | - |
аргументы конструктора для передачи конструктору
T2
|
| xy | - |
пара, два члена которой являются аргументами конструктора для
T1
и
T2
|
| tup | - | аргументы для объединения |
Примечания
Эта функция вызывается (через
std::allocator_traits
) любым объектом с поддержкой аллокатора, таким как
std::vector
, которому был передан
std::scoped_allocator_adaptor
в качестве используемого аллокатора. Поскольку
inner_allocator_type
сам является специализацией
std::scoped_allocator_adaptor
, эта функция также будет вызываться, когда объекты с поддержкой аллокатора, созданные через эту функцию, начинают конструировать свои собственные элементы.
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2203 | C++11 |
внутренние аллокаторы получались путем value-инициализации
объекта
inner_allocator_type
|
получаются путем вызова
inner_allocator()
|
|
LWG 2511
( P0475R1 ) |
C++11 |
concat-args
мог копировать элементы
std::tuple
|
исключены все операции копирования элементов |
| LWG 2586 | C++11 |
проверялись только конструкции из
inner_allocator_type
rvalues
|
проверяются конструкции из non-const
inner_allocator_type
lvalues вместо этого
|
| LWG 2975 | C++11 | перегрузка (1) не была ограничена | ограничена для отказа от std::pair |
Смотрите также
|
[static]
|
создает объект в выделенной памяти
(шаблон функции) |
|
(до C++20)
|
создает объект в выделенной памяти
(публичная функция-член
std::allocator<T>
)
|