std::is_copy_assignable, std::is_trivially_copy_assignable, std::is_nothrow_copy_assignable
| Определено в заголовочном файле <type_traits>
|
||
template< class T > struct is_copy_assignable; |
(1) | (начиная с C++11) |
template< class T > struct is_trivially_copy_assignable; |
(2) | (начиная с C++11) |
template< class T > struct is_nothrow_copy_assignable; |
(3) | (начиная с C++11) |
T не является типом, на который можно ссылаться (т.е., возможно, cv-квалифицированным void или функциональным типом с последовательностью cv-квалификаторов или ссылочным квалификатором), предоставляет константу-элемент value, равную false. Иначе предоставляет константу-элемент value, равную std::is_assignable<T&, const T&>::value.std::is_trivially_assignable<T&, const T&>std::is_nothrow_assignable<T&, const T&>T должен быть полным типом, (возможно, cv-квалифицированным) void или массивом с неизвестной границей. Иначе поведение не определено.
Если реализация приведённого выше шаблона прямо или косвенно зависит от неполного типа, и эта реализация могла бы дать другой результат, если бы этот тип был гипотетически завершён, поведение не определено.
Поведение программы, добавляющей специализации для любых шаблонов, описанных на этой странице не определено.
Вспомогательные шаблонные переменные
<tbody> </tbody> template< class T > inline constexpr bool is_copy_assignable_v = is_copy_assignable<T>::value; |
(начиная с C++17) | |
template< class T > inline constexpr bool is_trivially_copy_assignable_v = is_trivially_copy_assignable<T>::value; |
(начиная с C++17) | |
template< class T > inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<T>::value; |
(начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] |
true, если T присваиваемый копированием, false иначе (public static константа-элемент) |
Функции-элементы
operator bool |
преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) |
возвращает value (public функция-элемент) |
Типы элементы
| Тип | Определение |
value_type
|
bool
|
type
|
std::integral_constant<bool, value>
|
Возможная реализация
template< class T>
struct is_copy_assignable
: std::is_assignable< typename std::add_lvalue_reference<T>::type,
typename std::add_lvalue_reference<const T>::type> {};
template< class T>
struct is_trivially_copy_assignable
: std::is_trivially_assignable< typename std::add_lvalue_reference<T>::type,
typename std::add_lvalue_reference<const T>::type> {};
template< class T>
struct is_nothrow_copy_assignable
: std::is_nothrow_assignable< typename std::add_lvalue_reference<T>::type,
typename std::add_lvalue_reference<const T>::type> {};
|
Примечание
Свойство типа std::is_copy_assignable менее строго, чем концепт CopyAssignable, так как оно не проверяет тип результата присваивания (который для CopyAssignable типов должен быть левосторонним типом T) и не проверяет семантическое требование, чтобы выражение аргумента оставалось неизменным. Оно также не проверяет, что T соответствует MoveAssignable, что требуется для всех типов CopyAssignable.
Пример
#include <iostream>
#include <utility>
#include <type_traits>
struct Foo { int n; };
int main() {
std::cout << std::boolalpha
<< "Foo тривиально копируется с помощью присваивания? "
<< std::is_trivially_copy_assignable<Foo>::value << '\n'
<< "int[2] копируется с помощью присваивания? "
<< std::is_copy_assignable<int[2]>::value << '\n'
<< "int копируется без исключений с помощью присваивания? "
<< std::is_nothrow_copy_assignable<int>::value << '\n';
}
Вывод:
Foo тривиально копируется с помощью присваивания? true
int[2] копируется с помощью присваивания? false
int копируется без исключений с помощью присваивания? true
Смотрите также
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа оператор присваивания для определённого аргумента (шаблон класса) |
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа оператор присваивания перемещением (шаблон класса) |