std::is_swappable_with, std::is_swappable, std::is_nothrow_swappable_with, std::is_nothrow_swappable
Определён в заголовочном файле <type_traits> | ||
|---|---|---|
template< class T, class U > struct is_swappable_with; | (1) | (начиная с C++17) |
template< class T > struct is_swappable; | (2) | (начиная с C++17) |
template< class T, class U > struct is_nothrow_swappable_with; | (3) | (начиная с C++17) |
template< class T > struct is_nothrow_swappable; | (4) | (начиная с C++17) |
swap(std::declval<T>(), std::declval<U>()) и swap(std::declval<U>(), std::declval<T>()) корректно сформированы в невычисляемом контексте после using std::swap; (см. Swappable), предоставляет константу-член value, равную true. В противном случае value равно false. Проверки доступа выполняются так, как если бы они производились из контекста, не связанного ни с одним из типов. T не является типом, на который можно ссылаться (то есть, возможно, cv-квалифицированный void или тип функции с cv-списком квалификаторов или ref-квалификатором), предоставляет константу-член value, равную false. В противном случае предоставляет константу-член value, равную std::is_swappable_with<T&, T&>::value.std::is_nothrow_swappable_with.Если T или U не является полным типом, (возможно, cv-квалифицированным) void или массивом неизвестного размера, поведение не определено.
Если инстанцирование шаблона выше прямо или косвенно зависит от неполного типа и это инстанцирование могло бы дать другой результат, если бы этот тип гипотетически стал полным, поведение не определено.
Если программа добавляет специализации для любого из шаблонов, описанных на этой странице, поведение не определено.
Вспомогательные шаблоны переменных
template< class T, class U > inline constexpr bool is_swappable_with_v = is_swappable_with<T, U>::value; | (начиная с C++17) | |
template< class T > inline constexpr bool is_swappable_v = is_swappable<T>::value; | (начиная с C++17) | |
template< class T, class U > inline constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with<T, U>::value; | (начиная с C++17) | |
template< class T > inline constexpr bool is_nothrow_swappable_v = is_nothrow_swappable<T>::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_swappable_with<T, U>::value компилируется и вычисляется как true.
Пример
См. также
| обменивает значения двух объектов (шаблон функции) |
|
| обменивает элементы, на которые указывают два итератора (шаблон функции) |
|
|
(C++20) | обменивает значения, на которые ссылаются два разыменуемых объекта (объект-точка настройки) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор перемещающего присваивания (шаблон класса) |
|
(C++20)(C++20) | задаёт требования к типу, допускающему обмен, или к паре типов, значения которых можно обменивать друг с другом (концепт) |
|
(C++20) | задаёт требование, согласно которому значения, на которые ссылаются два типа indirectly_readable, можно обменивать (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_swappable