[meta.rel] (original) (raw)

template<class T, class U>
struct is_same;

T and U name the same type with the same cv-qualifications

template<class Base, class Derived>
struct is_base_of;

Base is a base class of Derived ([class.derived]) without regard to cv-qualifiers or Base and Derived are not unions and name the same class type without regard to cv-qualifiers

If Base andDerived are non-union class types and are not (possibly cv-qualified versions of) the same type,Derived shall be a complete type.

template<class Base, class Derived>
struct is_virtual_base_of;

Base is a virtual base class of Derived ([class.mi]) without regard to cv-qualifiers.

If Base andDerived are non-union class types,Derived shall be a complete type.

template<class From, class To>
struct is_convertible;

From and To shall be complete types,cv void, or arrays of unknown bound.

template<class From, class To>
struct is_nothrow_convertible;

is_convertible_v<From, To> is true and the conversion, as defined by is_convertible, is known not to throw any exceptions ([expr.unary.noexcept])

From and To shall be complete types,cv void, or arrays of unknown bound.

template<class T, class U>
struct is_layout_compatible;

T and U shall be complete types,cv void, or arrays of unknown bound.

template<class Base, class Derived>
struct is_pointer_interconvertible_base_of;

Derived is unambiguously derived from Base without regard to cv-qualifiers, and each object of type Derived is pointer-interconvertible ([basic.compound]) with its Base subobject, or Base and Derived are not unions and name the same class type without regard to cv-qualifiers.

If Base and Derived are non-union class types and are not (possibly cv-qualified versions of) the same type,Derived shall be a complete type.

template<class Fn, class... ArgTypes>
struct is_invocable;

The expression INVOKE(declval<Fn>(), declval<ArgTypes>()...) ([func.require]) is well-formed when treated as an unevaluated operand ([expr.context])

Fn and all types in the template parameter pack ArgTypes shall be complete types, cv void, or arrays of unknown bound.

template<class R, class Fn, class... ArgTypes>
struct is_invocable_r;

The expression INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...) is well-formed when treated as an unevaluated operand

Fn, R, and all types in the template parameter pack ArgTypes shall be complete types, cv void, or arrays of unknown bound.

template<class Fn, class... ArgTypes>
struct is_nothrow_invocable;

is_invocable_v<
Fn, ArgTypes...> is true and the expression INVOKE(declval<Fn>(), declval<ArgTypes>()...) is known not to throw any exceptions ([expr.unary.noexcept])

Fn and all types in the template parameter pack ArgTypes shall be complete types, cv void, or arrays of unknown bound.

template<class R, class Fn, class... ArgTypes>
struct is_nothrow_invocable_r;

is_invocable_r_v<
R, Fn, ArgTypes...> is true and the expression INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...) is known not to throw any exceptions ([expr.unary.noexcept])

Fn, R, and all types in the template parameter pack ArgTypes shall be complete types, cv void, or arrays of unknown bound.