std::is_copy_assignable, std::is_trivially_copy_assignable, std::is_nothrow_copy_assignable
Определено в заголовочном файле <type_traits>
|
||
template< class T > struct is_copy_assignable; |
(1) | (начиная с C++11) |
template< class T > struct is_trivially_copy_assignable; |
(2) | (начиная с C++11) |
template< class T > struct is_nothrow_copy_assignable; |
(3) | (начиная с C++11) |
T
не является типом, на который можно ссылаться (т.е., возможно, cv-квалифицированным void или функциональным типом с последовательностью cv-квалификаторов или ссылочным квалификатором), предоставляет константу-элемент value
, равную false. Иначе предоставляет константу-элемент value
, равную std::is_assignable<T&, const T&>::value.T
должен быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.
Содержание |
[править] Вспомогательные шаблонные переменные
template< class T > inline constexpr bool is_copy_assignable_v = is_copy_assignable<T>::value; |
(начиная с C++17) | |
template< class T > inline constexpr bool is_trivially_copy_assignable_v = is_trivially_copy_assignable<T>::value; |
(начиная с C++17) | |
template< class T > inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<T>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] |
true, если T присваиваемый копированием, false иначе (public static константа-элемент) |
Функции-элементы
operator bool |
преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
Тип | Определение |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[править] Возможная реализация
template< class T> struct is_copy_assignable : std::is_assignable< typename std::add_lvalue_reference<T>::type, typename std::add_lvalue_reference<const T>::type> {}; template< class T> struct is_trivially_copy_assignable : std::is_trivially_assignable< typename std::add_lvalue_reference<T>::type, typename std::add_lvalue_reference<const T>::type> {}; template< class T> struct is_nothrow_copy_assignable : std::is_nothrow_assignable< typename std::add_lvalue_reference<T>::type, typename std::add_lvalue_reference<const T>::type> {}; |
[править] Примечание
Свойство типа std::is_copy_assignable
менее строго, чем концепт CopyAssignable
, так как оно не проверяет тип результата присваивания (который для CopyAssignable
типов должен быть левосторонним типом T
) и не проверяет семантическое требование, чтобы выражение аргумента оставалось неизменным. Оно также не проверяет, что T
соответствует MoveAssignable, что требуется для всех типов CopyAssignable.
[править] Пример
#include <iostream> #include <utility> #include <type_traits> struct Foo { int n; }; int main() { std::cout << std::boolalpha << "Foo тривиально копируется с помощью присваивания? " << std::is_trivially_copy_assignable<Foo>::value << '\n' << "int[2] копируется с помощью присваивания? " << std::is_copy_assignable<int[2]>::value << '\n' << "int копируется без исключений с помощью присваивания? " << std::is_nothrow_copy_assignable<int>::value << '\n'; }
Вывод:
Foo тривиально копируется с помощью присваивания? true int[2] копируется с помощью присваивания? false int копируется без исключений с помощью присваивания? true
[править] Смотрите также
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа оператор присваивания для определённого аргумента (шаблон класса) |
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа оператор присваивания перемещением (шаблон класса) |