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

std::is_swappable_with, std::is_swappable, std::is_nothrow_swappable_with, std::is_nothrow_swappable

Материал из cppreference.com
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(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++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
<tbody> </tbody>
Определено в заголовочном файле <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)
1) Если выражения swap(std::declval<T>(), std::declval<U>()) и swap(std::declval<U>(), std::declval<T>()) корректны в невычисляемом контексте после using std::swap; (смотрите Swappable), предоставляет константу-элемент value, равную true. В противном случае value равна false. Проверки доступа выполняются как из контекста, не связанного ни с одним из типов.
2) Если T не является типом, на который можно ссылаться (т.е., возможно, cv-квалифицированным void или функциональным типом с последовательностью cv-квалификаторов или ссылочным квалификатором), предоставляет константу-элемент value, равную false. Иначе предоставляет константу-элемент value, равную std::is_swappable_with<T&, T&>::value
3) То же, что и (1), но известно, что вычисления обоих выражений из (1) не вызывают исключений
4) То же, что и (2), но использует std::is_nothrow_swappable_with.

T и U должен каждый быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.

Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.

Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.

Вспомогательные шаблоны переменных

<tbody> </tbody>
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 иначе
(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_swappable_with<T,U>::value компилируется и оценивается как true.

Пример

Смотрите также

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