Spec-Zone.ru › C++

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 создаваемому объекту.

1) Создает объект указанного типа 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>& );

, /*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++.

Отчет об ошибке Применен к Опубликованное поведение Корректное поведение
LWG 2969 C++17 при конструировании с использованием аллокатора передавался resource() передается *this
LWG 2975 C++17 в некоторых случаях для создания пары ошибочно используется первая перегрузка перегрузка ограничена так, чтобы не принимать пары
LWG 3525 C++17 ни одна перегрузка не могла обрабатывать типы, не являющиеся pair, но преобразуемые в pair добавлена перегрузка для повторного создания объекта

См. также

construct
[статическая]
создает объект в выделенном хранилище
(шаблон функции)
construct
(до 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API