Namespaces
Variants

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

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода, присутствуют только структурные элементы таблицы. Все теги и атрибуты сохранены в оригинальном виде в соответствии с требованиями.)
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,
std:: piecewise_construct_t ,
std:: tuple < Args1... > x,

std:: tuple < Args2... > y ) ;
(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 вниз на создаваемый объект.

1) Создает объект заданного типа 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) Эквивалентно
5) Эквивалентно
6) Эквивалентно
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> )