std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable
Определено в заголовочном файле <type_traits> | ||
template<class T, class U > struct is_assignable; | (1) | (начиная с C++11) |
template<class T, class U > struct is_trivially_assignable; | (2) | (начиная с C++11) |
template<class T, class U > struct is_nothrow_assignable; | (3) | (начиная с C++11) |
value
, равную true, иначе равную false. Проверки доступа выполняются так, как если бы они исходили из контекста, не связанного ни с одним из типов.T
и U
должен каждый быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.
Содержание |
[править]Вспомогательные шаблонные переменные
template<class T, class U > inlineconstexprbool is_assignable_v = is_assignable<T, U>::value; | (начиная с C++17) | |
template<class T, class U > inlineconstexprbool is_trivially_assignable_v = is_trivially_assignable<T, U>::value; | (начиная с C++17) | |
template<class T, class U > inlineconstexprbool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value; | (начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] | true, если T присваивается из U , false иначе (public static константа-элемент) |
Функции-элементы
operator bool | преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) | возвращает value (public функция-элемент) |
Типы элементы
Тип | Определение |
value_type | bool |
type | std::integral_constant<bool, value> |
[править]Примечание
Это свойство типа не проверяет ничего вне непосредственного контекста выражения присваивания: если использование T
или U
вызовет специализацию шаблона, генерацию неявно определённых специальных функций-элементов и т.д., и в них есть ошибки, фактическое присваивание может не скомпилироваться, даже если std::is_assignable<T,U>::value
компилируется и оценивается как true
.
[править]Пример
#include <iostream>#include <string>#include <type_traits> struct Ex1 {int n;}; int main(){std::cout<<std::boolalpha<<"int можно присвоить из int? "<< std::is_assignable<int, int>::value<<'\n'// 1 = 1; не скомпилируется<<"int& можно присвоить из int? "<< std::is_assignable<int&, int>::value<<'\n'// int a; a = 1;// будет работать<<"int можно присвоить из double? "<< std::is_assignable<int, double>::value<<'\n'<<"int& можно присвоить из double без исключений? "<< std::is_nothrow_assignable<int&, double>::value<<'\n'<<"string можно присвоить из double? "<< std::is_assignable<std::string, double>::value<<'\n'<<"Ex1& можно тривиально присвоить из const Ex1&? "<< std::is_trivially_assignable<Ex1&, const Ex1&>::value<<'\n';}
Вывод:
int можно присвоить из int? false int& можно присвоить из int? true int можно присвоить из double? false int& можно присвоить из double без исключений? true string можно присвоить из double? true Ex1& можно тривиально присвоить из const Ex1&? true
[править]Смотрите также
(C++11)(C++11)(C++11) | проверяет, есть ли у типа оператор присваивания копированием (шаблон класса) |
(C++11)(C++11)(C++11) | проверяет, есть ли у типа оператор присваивания перемещением (шаблон класса) |
(C++20) | указывает, что типу может быть присвоен другой тип (концепт) |