std:: uses_allocator_construction_args
|
Определено в заголовочном файле
<memory>
|
||
T
не является специализацией
std::pair
|
||
|
template
<
class
T,
class
Alloc,
class
...
Args
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(1) | (начиная с C++20) |
T
является специализацией
std::pair
|
||
|
template
<
class
T,
class
Alloc,
class
Tuple1,
class
Tuple2
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(2) | (начиная с C++20) |
|
template
<
class
T,
class
Alloc
>
constexpr auto uses_allocator_construction_args ( const Alloc & alloc ) noexcept ; |
(3) | (начиная с C++20) |
|
template
<
class
T,
class
Alloc,
class
U,
class
V
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(4) | (начиная с C++20) |
|
template
<
class
T,
class
Alloc,
class
U,
class
V
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(5) | (начиная с C++23) |
|
template
<
class
T,
class
Alloc,
class
U,
class
V
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(6) | (начиная с C++20) |
|
template
<
class
T,
class
Alloc,
class
U,
class
V
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(7) | (начиная с C++20) |
|
template
<
class
T,
class
Alloc,
class
U,
class
V
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(8) | (начиная с C++23) |
|
template
<
class
T,
class
Alloc,
class
NonPair
>
constexpr
auto
uses_allocator_construction_args
(
const
Alloc
&
alloc,
|
(9) | (начиная с C++20) |
Подготавливает список аргументов, необходимый для создания объекта заданного типа
T
посредством
uses-allocator конструирования
.
T
не является специализацией
std::pair
. Возвращает
std::tuple
, определяемый следующим образом:
- Если std:: uses_allocator_v < T, Alloc > равно false и std:: is_constructible_v < T, Args... > равно true , возвращает std:: forward_as_tuple ( std:: forward < Args > ( args ) ... ) .
-
Иначе, если
std::
uses_allocator_v
<
T, Alloc
>
равно
true
и
std::
is_constructible_v
<
T,
std::
allocator_arg_t
,
const
Alloc
&
, Args...
>
равно
true
, возвращает
std:: tuple < std:: allocator_arg_t , const Alloc & , Args && ... > ( std:: allocator_arg , alloc,
std:: forward < Args > ( args ) ... ) . - Иначе, если std:: uses_allocator_v < T, Alloc > равно true и std:: is_constructible_v < T, Args..., const Alloc & > равно true , возвращает std:: forward_as_tuple ( std:: forward < Args > ( args ) ..., alloc ) .
- Иначе, программа является некорректной.
T
является специализацией
std::pair
. Для
T
, который является
std::
pair
<
T1, T2
>
, эквивалентно
return std::make_tuple(std::piecewise_construct, std::apply([&alloc](auto&&... args1) { return std::uses_allocator_construction_args<T1>(alloc, std::forward<decltype(args1)>(args1)...); }, std::forward<Tuple1>(x) ), std::apply([&alloc](auto&&... args2) { return std::uses_allocator_construction_args<T2>(alloc, std::forward<decltype(args2)>(args2)...); }, std::forward<Tuple2>(y) ) );
T
является специализацией
std::pair
. Эквивалентно
return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::tuple<>{}, std::tuple<>{} );
T
является специализацией
std::pair
. Эквивалентно
return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(u)), std::forward_as_tuple(std::forward<V>(v)) );
T
является специализацией
std::pair
. Эквивалентно
return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::forward_as_tuple(pr.first), std::forward_as_tuple(pr.second) );
T
является специализацией
std::pair
. Эквивалентно
return std::uses_allocator_construction_args<T>(alloc, std::piecewise_construct, std::forward_as_tuple(std::get<0>(std::move(pr))), std::forward_as_tuple(std::get<1>(std::move(pr))) );
T
является специализацией
std::pair
, и при условии, что данная демонстрационная шаблонная функция
template<class A, class B> void /*deduce-as-pair*/(const std::pair<A, B>&);
,
/*deduce-as-pair*/
(
non_pair
)
является некорректной при рассмотрении как невычисляемый операнд.
Пусть демонстрационный класс
pair-constructor
определён как
class /*pair-constructor*/ { const Alloc& alloc_; // exposition only NonPair& u_; // exposition only constexpr reconstruct(const std::remove_cv<T>& p) const // exposition only { return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, p); } constexpr reconstruct(std::remove_cv<T>&& p) const // exposition only { return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, std::move(p)); } public: constexpr operator std::remove_cv<T>() const { return reconstruct(std::forward<NonPair>(u_)); } };
pair_construction
является значением типа
pair-constructor
, чьи члены
alloc_
и
u_
являются
alloc
и
non_pair
соответственно.
Содержание |
Параметры
| alloc | - | аллокатор для использования |
| args | - |
аргументы для передачи конструктору
T
|
| x | - |
кортеж аргументов для передачи конструкторам
first
элемента данных
T
|
| y | - |
кортеж аргументов для передачи конструкторам
second
элемента данных
T
|
| u | - |
единственный аргумент для передачи конструктору
first
элемента данных
T
|
| v | - |
единственный аргумент для передачи конструктору
second
элемента данных
T
|
| pr | - |
пара, чей элемент данных
first
будет передан конструктору
first
элемента данных
T
, а элемент данных
second
будет передан конструктору
second
элемента данных
T
|
| non_pair | - | единственный аргумент для преобразования в std::pair для последующего конструирования |
Возвращаемое значение
std::tuple
аргументов, подходящих для передачи в конструктор
T
.
Примечания
Перегрузки (2-9) обеспечивают распространение аллокатора в std::pair , который не поддерживает ни соглашения о ведущем аллокаторе, ни соглашения о завершающем аллокаторе (в отличие от, например, std::tuple , который использует соглашение о ведущем аллокаторе).
При использовании в uses-allocator конструировании, функция преобразования
pair-constructor
сначала преобразует предоставленный аргумент в
std::pair
, а затем конструирует результат из этого
std::pair
посредством uses-allocator конструирования.
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3525 | C++20 |
ни одна перегрузка не могла обрабатывать не-
pair
типы, конвертируемые в
pair
|
добавлена реконструирующая перегрузка |
Смотрите также
|
(C++11)
|
проверяет, поддерживает ли указанный тип uses-allocator construction
(шаблон класса) |
|
(C++20)
|
создает объект заданного типа посредством uses-allocator construction
(шаблон функции) |
|
создает объект заданного типа в указанном месте памяти посредством uses-allocator construction
(шаблон функции) |