Пространства имён
Варианты
Действия

std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <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)
1) Если выражение std::declval<T>()=std::declval<U>() корректно в контексте не требующем выполнения, то предоставляет константу-элемент value, равную true, иначе равную false. Проверки доступа выполняются так, как если бы они исходили из контекста, не связанного ни с одним из типов.
2) То же, что (1), но вычисление выражения присваивания не вызовет никакой не тривиальной операции. Для целей этой проверки вызов std::declval считается тривиальным и не считается использующим odrstd::declval.
3) То же, что и (1), но вычисление выражения присваивания не вызовет никакой операции, отличной от noexcept.

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_typebool
typestd::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

[править]Смотрите также

проверяет, есть ли у типа оператор присваивания копированием
(шаблон класса)[править]
проверяет, есть ли у типа оператор присваивания перемещением
(шаблон класса)[править]
указывает, что типу может быть присвоен другой тип
(концепт)[править]
close