23 General utilities library [utilities]

23.10 Memory [memory]

23.10.7 uses_­allocator [allocator.uses]

23.10.7.1 uses_­allocator trait [allocator.uses.trait]

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.

23.10.7.2 Uses-allocator construction [allocator.uses.construction]

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