Этот подпункт содержит шаблоны, которые могут использоваться для запроса отношений между типами во время компиляции.
Каждый из этих шаблонов должен быть BinaryTypeTrait с базовой характеристикой, true_type если соответствующее условие истинно, в противном случае false_type.
Шаблон | Состояние | Комментарии |
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