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,
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 создаваемому объекту.
U посредством конструирования с использованием аллокатора в неинициализированной области памяти, обозначенной 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>& ); , 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++.
| Отчет об ошибке | Применен к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2969 | C++17 | при конструировании с использованием аллокатора передавался resource() | передается *this |
| LWG 2975 | C++17 | в некоторых случаях для создания пары ошибочно используется первая перегрузка | перегрузка ограничена так, чтобы не принимать пары |
| LWG 3525 | C++17 | ни одна перегрузка не могла обрабатывать типы, не являющиеся pair, но преобразуемые в pair | добавлена перегрузка для повторного создания объекта |
См. также
|
[статическая] | создает объект в выделенном хранилище (шаблон функции) |
|
(до C++20) | создает объект в выделенном хранилище (открытая функция-член std::allocator<T>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/polymorphic_allocator/construct