23 General utilities library [utilities]

23.15 Metaprogramming and type traits [meta]

23.15.6 Relationships between types [meta.rel]

Этот подпункт содержит шаблоны, которые могут использоваться для запроса отношений между типами во время компиляции.

Каждый из этих шаблонов должен быть BinaryTypeTrait с базовой характеристикой, true_­type если соответствующее условие истинно, в противном случае false_­type.

Таблица 44 - Предикаты отношения типов
ШаблонСостояниеКомментарии
template <class T, class U>
struct is_­same;
T и U назовите тот же тип с одинаковыми CV-квалификациями
template <class Base, class Derived>
struct is_­base_­of;
Base является базовым классом Derived (Clause [class.derived]) без учета cv-квалификаторов или Base и Derived не является объединением и называет один и тот же тип класса без учета cv-квалификаторов Если Base и Derived являются типами класса без объединения и, возможно, не являются версиями одного и того же типа с квалификацией cv, Derived должен быть полным типом. [ Note: Базовые классы, которые являются частными, защищенными или неоднозначными, тем не менее, являются базовыми классами. ] end note
template <class From, class To>
struct is_­convertible;
see below From и To должны быть полными типами, массивами с неизвестной границей или cv void типами.
template <class Fn, class... ArgTypes>
struct is_­invocable;
Выражение INVOKE(declval<Fn>(), declval<ArgTypes>()...) правильно сформировано, когда рассматривается как неоцененный операнд Fn и все типы в пакете параметров ArgTypes должны быть полными типами cv voidили массивами с неизвестной границей.
template <class R, class Fn, class... ArgTypes>
struct is_­invocable_­r;
Выражение INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...) правильно сформировано, когда рассматривается как неоцененный операнд Fn,, Rи все типы в пакете параметров ArgTypes должны быть полными типами cv voidили массивами с неизвестной границей.
template <class Fn, class... ArgTypes>
struct is_­nothrow_­invocable;
is_­invocable_­v<
Fn, ArgTypes...> есть true и выражение, INVOKE(declval<Fn>(), declval<ArgTypes>()...) как известно, не генерирует никаких исключений
Fn и все типы в пакете параметров ArgTypes должны быть полными типами cv voidили массивами с неизвестной границей.
template <class R, class Fn, class... ArgTypes>
struct is_­nothrow_­invocable_­r;
is_­invocable_­r_­v<
R, Fn, ArgTypes...> есть true и выражение, INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...) как известно, не генерирует никаких исключений
Fn,, Rи все типы в пакете параметров ArgTypes должны быть полными типами cv voidили массивами с неизвестной границей.

В целях определения шаблонов в этом подпункте выражение вызова функции declval<T>() для любого типа T рассматривается как тривиальный вызов функции ([basic.types], [special]), который не является odr-use элементом of declval в контексте соответствующего определения, несмотря на ограничения [declval].

[Example:

struct B {};
struct B1 : B {};
struct B2 : B {};
struct D : private B1, private B2 {};

is_base_of_v<B, D>         // true
is_base_of_v<const B, D>   // true
is_base_of_v<B, const D>   // true
is_base_of_v<B, const B>   // true
is_base_of_v<D, B>         // false
is_base_of_v<B&, D&>       // false
is_base_of_v<B[3], D[3]>   // false
is_base_of_v<int, int>     // false

end example]

Условие предиката для специализации шаблона is_­convertible<From, To> должно выполняться тогда и только тогда, когда возвращаемое выражение в следующем коде будет правильно сформировано, включая любые неявные преобразования в тип возвращаемого значения функции:

To test() {
  return declval<From>();
}

[ Note: Это требование дает четко определенные результаты для ссылочных типов, пустых типов, типов массивов и типов функций. ] Проверка доступа выполняется в контексте, не связанном с и . Только действительность непосредственного контекста из -за заявления ( в том числе инициализации возвращаемого объекта или ссылки) рассматривается. [ Инициализация может привести к побочным эффектам, таким как создание экземпляров специализаций шаблонов классов и специализаций шаблонов функций, создание неявно определенных функций и т. Д. Такие побочные эффекты не относятся к «непосредственному контексту» и могут привести к неправильному формированию программы. ]end note To Fromexpression return Note: end note