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) |
std::declval<T>() = std::declval<U>() корректно в контексте, где результат не используется, предоставляет статическое член-константу value равную true. В противном случае value равна false. Проверки доступа выполняются так, как если бы они происходили из контекста, не связанного ни с одним типом.std::declval считается тривиальным и не считается odr-использованием std::declval.T и U должны быть полными типами (возможно, с квалификаторами cv), void или массивом неизвестной длины. В противном случае поведение не определено.
Если экземпляр шаблона выше зависит, прямо или косвенно, от неполного типа, и этот экземпляр может дать другой результат, если этот тип будет гипотетически завершен, то поведение не определено.
Поведение программы, которая добавляет специализации для любого из описанных на этой странице шаблонов, не определено.
Вспомогательные шаблоны переменных
template< class T, class U > inline constexpr bool is_assignable_v = is_assignable<T, U>::value; | (с C++17) | |
template< class T, class U > inline constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value; | (с C++17) | |
template< class T, class U > inline constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value; | (с C++17) |
Унаследовано от std::integral_constant
Члены-константы
| value
[static] | true если T присваиваемое U, false в противном случае (публичная статическая член-константа) |
Члены-функции
| operator bool | преобразует объект в bool, возвращает value (публичная член-функция) |
| operator()
(C++14) | возвращает value (публичная член-функция) |
Типы членов
| Тип | Определение |
|---|---|
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 is assignable from int? "
<< std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile
<< "int& is assignable from int? "
<< std::is_assignable<int&, int>::value << '\n' // int a; a = 1; works
<< "int is assignable from double? "
<< std::is_assignable<int, double>::value << '\n'
<< "int& is nothrow assignable from double? "
<< std::is_nothrow_assignable<int&, double>::value << '\n'
<< "string is assignable from double? "
<< std::is_assignable<std::string, double>::value << '\n'
<< "Ex1& is trivially assignable from const Ex1&? "
<< std::is_trivially_assignable<Ex1&, const Ex1&>::value << '\n';
}Вывод:
int is assignable from int? false int& is assignable from int? true int is assignable from double? false int& is nothrow assignable from double? true string is assignable from double? true Ex1& is trivially assignable from const Ex1&? true
См. также
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор копирующего присваивания (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор перемещающего присваивания (шаблон класса) |
|
(C++20) | определяет, что тип присваивается из другого типа (концепция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_assignable