Spec-Zone.ru › C++

std::uses_allocator

Определён в заголовочном файле <memory>
template< class T, class Alloc >
struct uses_allocator;
(начиная с C++11)

Если у T есть вложенный тип allocator_type, преобразуемый из Alloc, константа-член value равна true. В противном случае value равна false.

Вспомогательный шаблон переменной

template< class T, class Alloc >
constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value;
(начиная с C++17)

Наследуется от std::integral_constant

Константы-члены

value
[static]
true, если T использует аллокатор Alloc, иначе false
(открытая статическая константа-член)

Функции-члены

operator bool
преобразует объект в bool, возвращает value
(открытая функция-член)
operator()
(C++14)
возвращает value
(открытая функция-член)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool,value>

Конструирование с использованием аллокатора

Существует три соглашения о передаче аллокатора alloc конструктору некоторого типа T:

  • Если T не использует совместимый аллокатор (std::uses_allocator_v<T, Alloc> — false), то alloc игнорируется.
  • В противном случае std::uses_allocator_v<T, Alloc> равно true, и
    • если T использует соглашение с аллокатором в начале (вызывается как T(std::allocator_arg, alloc, args...)), то при конструировании с использованием аллокатора используется эта форма.
    • если T использует соглашение с аллокатором в конце (вызывается как T(args..., alloc)), то при конструировании с использованием аллокатора используется эта форма.
    • В противном случае программа некорректна (это означает, что std::uses_allocator_v<T, Alloc> равно true, но тип не соответствует ни одному из двух разрешённых соглашений).
  • В особом случае std::pair считается типом, использующим аллокатор, несмотря на то что для пар std::uses_allocator равно false (в отличие, например, от std::tuple): см. перегрузки для пар std::pmr::polymorphic_allocator::construct и std::scoped_allocator_adaptor::construct(до C++20)std::uses_allocator_construction_args(начиная с C++20).

Вспомогательные функции std::make_obj_using_allocator и std::uninitialized_construct_using_allocator можно использовать для явного создания объекта в соответствии с описанным выше протоколом, а std::uses_allocator_construction_args — для подготовки списка аргументов, соответствующего форме конструирования с использованием аллокатора, ожидаемой типом.

(начиная с C++20)

Специализации

Для типа, определённого программой T, у которого нет вложенного allocator_type, программа может специализировать std::uses_allocator так, чтобы он наследовался от std::true_type для T, если выполнено любое из следующих требований:

  • T имеет конструктор, принимающий std::allocator_arg_t в качестве первого аргумента и Alloc в качестве второго аргумента.
  • T имеет конструктор, принимающий Alloc в качестве последнего аргумента.

В приведённом выше случае Alloc — это тип, удовлетворяющий требованиям Allocator или являющийся типом указателя, преобразуемым в std::experimental::pmr::memory_resource*(расширение основных библиотек).

Стандартная библиотека уже предоставляет следующие специализации:

std::uses_allocator<std::tuple>
(C++11)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::queue>
(C++11)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::priority_queue>
(C++11)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::stack>
(C++11)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::flat_map>
(C++23)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::flat_set>
(C++23)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::flat_multimap>
(C++23)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::flat_multiset>
(C++23)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::function>
(C++11) (до C++17)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::promise>
(C++11)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)
std::uses_allocator<std::packaged_task>
(C++11) (до C++17)
специализирует типовой признак std::uses_allocator
(специализация шаблона класса)

Примечания

Этот типовой признак используется в std::tuple, std::scoped_allocator_adaptor и std::pmr::polymorphic_allocator. Он также может использоваться пользовательскими аллокаторами или типами-обёртками, чтобы определить, может ли создаваемый объект или член сам использовать аллокатор (например, является ли он контейнером); в таком случае его конструктору следует передать аллокатор.

См. также

allocator_argallocator_arg_t
(C++11)
тег для выбора конструкторов, учитывающих аллокатор
(тег)
uses_allocator_construction_args
(C++20)
подготавливает список аргументов, соответствующий требуемой для заданного типа форме конструирования с использованием аллокатора
(шаблон функции)
make_obj_using_allocator
(C++20)
создаёт объект заданного типа посредством конструирования с использованием аллокатора
(шаблон функции)
uninitialized_construct_using_allocator
(C++20)
создаёт объект заданного типа в указанной области памяти посредством конструирования с использованием аллокатора
(шаблон функции)
scoped_allocator_adaptor
(C++11)
реализует многоуровневый аллокатор для многоуровневых контейнеров
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/uses_allocator

Spec-Zone.ru

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