Не указано, определяет ли библиотека какие-либо полные или частичные специализации любого из этих шаблонов.
Для всех шаблонов классов,X объявленных в этом подпункте, создание экземпляра этого шаблона с аргументом шаблона, который является специализацией шаблона класса, может привести к неявному созданию экземпляра аргумента шаблона тогда и только тогда, когда семантикаX требует, чтобы аргумент был полным. тип.
В целях определения шаблонов в этом подпункте выражение вызова функцииdeclval<T>() для любого типаT рассматривается как тривиальный вызов функции ([basic.types],[special]), который не являетсяodr-use элементом ofdeclval в контексте соответствующего определения, несмотря на ограничения[declval].
Шаблон | Состояние | Предварительные условия |
template <class T> struct is_const; | T являетсяconst-qualified | |
template <class T> struct is_volatile; | T являетсяvolatile-qualified | |
template <class T> struct is_trivial; | T этоtrivial type | remove_all_extents_t<T> должен быть полным типом илиcvvoid. |
template <class T> struct is_trivially_copyable; | T этоtrivially copyable type | remove_all_extents_t<T> должен быть полным типом или cvvoid. |
template <class T> struct is_standard_layout; | T этоstandard-layout type | remove_all_extents_t<T> должен быть полным типом илиcvvoid. |
template <class T> struct is_pod; | T этоPOD type | remove_all_extents_t<T> должен быть полным типом илиcvvoid. |
template <class T> struct is_empty; | T - это тип класса, но не тип объединения, без нестатических членов данных, кроме битовых полей длины 0, без виртуальных функций-членов, без виртуальных базовых классов и без базового класса,B для которогоis_empty_v<B> естьfalse. | ЕслиT тип класса,T не являющийся объединением, должен быть полным типом. |
template <class T> struct is_polymorphic; | T этоpolymorphic class | ЕслиT тип класса,T не являющийся объединением, должен быть полным типом. |
template <class T> struct is_abstract; | T являетсяabstract class | ЕслиT тип класса,T не являющийся объединением, должен быть полным типом. |
template <class T> struct is_final; | T - это тип класса, отмеченныйclass-virt-specifier final (Условием[class]). [ Note: Объединение - это тип класса, который можно пометить значкомfinal. ] — end note | ЕслиT это тип класса, онT должен быть полным типом. |
template <class T> struct is_aggregate; | T является агрегатным типом ([dcl.init.aggr]) | remove_all_extents_t<T> должен быть полным типом илиcvvoid. |
template <class T> struct is_signed; | Еслиis_arithmetic_v<T> естьtrue, тот же результат, что и T(-1) < T(0); иначе,false | |
template <class T> struct is_unsigned; | Еслиis_arithmetic_v<T> естьtrue, тот же результат, что и T(0) < T(-1); иначе,false | |
template <class T, class... Args> struct is_constructible; | Для типа функцииT или дляcvvoid типаT, is_constructible_v<T, Args...> вfalseпротивном случаеsee below | T и все типы в пакете параметровArgs должны быть полными типамиcvvoidили массивами с неизвестной границей. |
template <class T> struct is_default_constructible; | is_constructible_v<T> естьtrue. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
template <class T> struct is_copy_constructible; | Для areferenceable typeTтот же результат, что is_constructible_v<T, const T&>и в противном случаеfalse. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
template <class T> struct is_move_constructible; | Для ссылочного типаTтот же результат, что is_constructible_v<T, T&&>и в противном случаеfalse. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
template <class T, class U> struct is_assignable; | Выражениеdeclval<T>() =declval<U>() правильно сформировано, если рассматривать его какunevaluated operand. Проверка доступа выполняется, как если бы в контексте, не связанном сT иU. Учитывается только действительность непосредственного контекста выражения присваивания. [ Note: Компиляция выражения может привести к побочным эффектам, таким как создание экземпляров специализаций шаблонов классов и специализаций шаблонов функций, создание неявно определенных функций и т. Д. Такие побочные эффекты не относятся к «непосредственному контексту» и могут привести к неправильному формированию программы. ] — end note | T иU должны быть полными типамиcvvoidили массивами с неизвестной границей. |
template <class T> struct is_copy_assignable; | Для ссылочного типаTтот же результат, что is_assignable_v<T&, const T&>и в противном случаеfalse. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
template <class T> struct is_move_assignable; | Для ссылочного типаTтот же результат, что is_assignable_v<T&, T&&>и в противном случаеfalse. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
template <class T, class U> struct is_swappable_with; | Каждое выражениеswap(declval<T>(), declval<U>()) и swap(declval<U>(), declval<T>()) имеет правильный формат, если рассматривать его какunevaluated operand контекст разрешения перегрузки для заменяемых значений ([swappable.requirements]). Проверка доступа выполняется, как если бы в контексте, не связанном сT иU. Учитывается только действительность непосредственного контекстаswap выражений. [ Note: Компиляция выражений может привести к побочным эффектам, таким как создание экземпляров специализаций шаблонов классов и специализаций шаблонов функций, создание неявно определенных функций и т. Д. Такие побочные эффекты не относятся к «непосредственному контексту» и могут привести к неправильному формированию программы. ] — end note | T иU должны быть полными типами cvvoidили массивами с неизвестной границей. |
template <class T> struct is_swappable; | Для ссылочного типаTтот же результат, чтоis_swappable_with_v<T&, T&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_destructible; | ЛибоT это ссылочный тип, либоT полный тип объекта, для которого выражение declval<U&>().~U() правильно сформировано при обработке какunevaluated operand, гдеU есть remove_all_extents<T>. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
template <class T, class... Args> struct is_trivially_constructible; |
is_constructible_v<T, Args...> is,true и известно, что определение переменной foris_constructible, как определено ниже, не вызывает никаких нетривиальных операций ([basic.types],[special]). | T и все типы в пакете параметровArgs должны быть полными типами cvvoidили массивами с неизвестной границей. |
template <class T> struct is_trivially_default_constructible; | is_trivially_constructible_v<T> естьtrue. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_trivially_copy_constructible; | Для ссылочного типаTтот же результат, что is_trivially_constructible_v<T, const T&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_trivially_move_constructible; | Для ссылочного типаTтот же результат, что is_trivially_constructible_v<T, T&&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T, class U> struct is_trivially_assignable; | is_assignable_v<T, U> есть,true и известно, что присвоение, как определено is_assignable, не вызывает никакой нетривиальной операции ([basic.types],[special]). | T иU должны быть полными типамиcvvoidили массивами с неизвестной границей. |
template <class T> struct is_trivially_copy_assignable; | Для ссылочного типаTтот же результат, что is_trivially_assignable_v<T&, const T&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_trivially_move_assignable; | Для ссылочного типаTтот же результат, что is_trivially_assignable_v<T&, T&&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_trivially_destructible; | is_destructible_v<T> естьtrue и указанный деструктор, как известно, тривиален. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T, class... Args> struct is_nothrow_constructible; | is_constructible_v<T, Args...> is,true а определение переменной foris_constructible, как определено ниже, не генерирует никаких исключений ([expr.unary.noexcept]). | T и все типы в пакете параметровArgs должны быть полными типамиcvvoidили массивами с неизвестной границей. |
template <class T> struct is_nothrow_default_constructible; | is_nothrow_constructible_v<T> естьtrue. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_nothrow_copy_constructible; | Для ссылочного типаTтот же результат, что is_nothrow_constructible_v<T, const T&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_nothrow_move_constructible; | Для ссылочного типаTтот же результат, что is_nothrow_constructible_v<T, T&&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T, class U> struct is_nothrow_assignable; | is_assignable_v<T, U> is,true и известно, что присвоение не генерирует никаких исключений ([expr.unary.noexcept]). | T иU должны быть полными типамиcvvoidили массивами с неизвестной границей. |
template <class T> struct is_nothrow_copy_assignable; | Для ссылочного типаTтот же результат, что is_nothrow_assignable_v<T&, const T&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_nothrow_move_assignable; | Для ссылочного типаTтот же результат, что is_nothrow_assignable_v<T&, T&&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T, class U> struct is_nothrow_swappable_with; | is_swappable_with_v<T, U> is,true и известно, что каждоеswap выражение определения не is_swappable_with<T, U> вызывает никаких исключений ([expr.unary.noexcept]). | T иU должны быть полными типами cvvoidили массивами с неизвестной границей. |
template <class T> struct is_nothrow_swappable; | Для ссылочного типаTтот же результат, чтоis_nothrow_swappable_with_v<T&, T&>и в противном случаеfalse. | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct is_nothrow_destructible; | is_destructible_v<T> is,true и известно, что указанный деструктор не генерирует никаких исключений ([expr.unary.noexcept]). | T должен быть полным типом cvvoidили массивом с неизвестной границей. |
template <class T> struct has_virtual_destructor; | T есть виртуальныйdestructor | ЕслиT тип класса,T не являющийся объединением, должен быть полным типом. |
template <class T> struct has_unique_object_representations; | Для типа массиваTтот же результат, что has_unique_object_representations_v<remove_all_extents_t<T>>и в противном случаеsee below. | T должен быть полным типомcvvoidили массивом с неизвестной границей. |
[ Example:
is_const_v<const volatile int> // true is_const_v<const int*> // false is_const_v<const int&> // false is_const_v<int[3]> // false is_const_v<const int[3]> // true
— end example ]
[ Example:
remove_const_t<const volatile int> // volatile int remove_const_t<const int* const> // const int* remove_const_t<const int&> // const int& remove_const_t<const int[3]> // int[3]
— end example ]
[ Example:
// Given: struct P final { }; union U1 { }; union U2 final { }; // the following assertions hold: static_assert(!is_final_v<int>); static_assert(is_final_v<P>); static_assert(!is_final_v<U1>); static_assert(is_final_v<U2>);
— end example ]
Условие предиката для специализации шаблона is_constructible<T, Args...> должно выполняться тогда и только тогда, когда следующее определение переменной будет правильно сформировано для некоторой придуманной переменнойt:
T t(declval<Args>()...);
[ Note: Эти токены никогда не интерпретируются как объявление функции. ] Проверка доступа выполняется, как если бы в контексте, не связанном ни с одним из файлов . Учитывается только действительность непосредственного контекста инициализации переменной. [ Оценка инициализации может привести к побочным эффектам, таким как создание экземпляров специализаций шаблонов классов и специализаций шаблонов функций, создание неявно определенных функций и т. Д. Такие побочные эффекты не относятся к «непосредственному контексту» и могут привести к неправильному формированию программы. ] — end note TArgs Note: — end note
Условие предиката для специализации шаблона has_unique_object_representations<T> должно выполняться тогда и только тогда, когда:
T легко копируется, и
любые два объекта типаT с одинаковым значением имеют одно и то же представление объекта, где два объекта типа массива или класса, не являющегося объединением, считаются имеющими одинаковое значение, если их соответствующие последовательности прямых подобъектов имеют одинаковые значения, и два объекта объединения type считаются имеющими одинаковое значение, если они имеют один и тот же активный член, а соответствующие члены имеют одинаковое значение.
Набор скалярных типов, для которых выполняется это условие, определяется реализацией. [ Note: Если тип имеет биты заполнения, условие не выполняется; в противном случае условие выполняется для целочисленных типов без знака. ] — end note