template <class T, class Alloc> struct uses_allocator;
Remarks: Автоматически определяет, T есть ли вложенный allocator_type конвертируемый из Alloc. Отвечает BinaryTypeTrait требованиям. Реализация должна обеспечивать определение, производное от true_type того, qualified-id T::allocator_type является ли действительным и обозначает тип ([temp.deduct]), а в is_convertible_v<Alloc, T::allocator_type> != falseпротивном случае оно должно быть производным от false_type. Программа может специализировать этот шаблон, чтобы он производился от true_type определяемого пользователем типа T , который не имеет вложенного, allocator_type но, тем не менее, может быть создан с помощью распределителя, где либо:
первый аргумент конструктора имеет тип, allocator_arg_t а второй аргумент имеет тип Alloc или
последний аргумент конструктора имеет тип Alloc.
Uses-allocator construction с распределителем Alloc относится к построению объекта obj типа Tс использованием аргументов v1, v2, ..., vN конструктора типов V1, V2, ..., VNсоответственно и распределителя alloc типа в Allocсоответствии со следующими правилами:
если uses_allocator_v<T, Alloc> есть false и is_constructible_v<T, V1, V2, ..., VN> есть true, то obj инициализируется как obj(v1, v2, ..., vN);
в противном случае, если uses_allocator_v<T, Alloc> есть true и is_constructible_v<T, allocator_arg_t, Alloc, V1, V2, ..., VN> есть true, то obj инициализируется как obj(allocator_arg, alloc, v1, v2, ..., vN);
в противном случае, если uses_allocator_v<T, Alloc> есть true и is_constructible_v<T, V1, V2, ..., VN, Alloc> есть true, то obj инициализируется как obj(v1, v2, ..., vN, alloc);
в противном случае запрос на построение распределителя использования будет некорректным. [ Note: Произойдет ошибка, если uses_allocator_v<T, Alloc> есть, true но конкретный конструктор не использует распределитель. Это определение предотвращает тихую ошибку передачи распределителя элементу. ] — end note