Namespaces
Variants

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

From ru.cppreference.net
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,
std:: piecewise_construct_t ,
std:: tuple < Args1... > x,

std:: tuple < Args2... > y ) ;
(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> )