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-qualifier-seq или ref-qualifier), предоставляет статическое константное член value, равное false. В противном случае, предоставляет статическое константное член value, равное std::is_assignable<T&, const T&>::value. T должен быть полным типом, (возможно, с квалификаторами cv) void или массивом неизвестной размерности. В противном случае поведение не определено.
Если экземпляр шаблона выше зависит, прямо или косвенно, от неполного типа, и этот экземпляр мог бы дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.
Поведение программы, которая добавляет специализации для любого из описанных здесь шаблонов, не определено.
Вспомогательные шаблоны переменных
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 в противном случае (публичная статическая константа) |
Члены-функции
| operator bool | преобразует объект в bool, возвращает value (публичная функция-член) |
| operator()
(C++14) | возвращает value (публичная функция-член) |
Типы членов
| Тип | Определение |
|---|---|
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 должен быть lvalue типа T) и не проверяет семантическое требование, что выражение аргумента остается неизменным. Она также не проверяет, что T удовлетворяет MoveAssignable, что требуется для всех типов CopyAssignable.
Пример
#include <iostream>
#include <type_traits>
#include <utility>
struct Foo { int n; };
int main()
{
std::cout << std::boolalpha
<< "Foo is trivially copy-assignable? "
<< std::is_trivially_copy_assignable<Foo>::value << '\n'
<< "int[2] is copy-assignable? "
<< std::is_copy_assignable<int[2]>::value << '\n'
<< "int is nothrow copy-assignable? "
<< std::is_nothrow_copy_assignable<int>::value << '\n';
}Вывод:
Foo is trivially copy-assignable? true int[2] is copy-assignable? false int is nothrow copy-assignable? true
См. также
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор присваивания для конкретного аргумента (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор перемещающего присваивания (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/is_copy_assignable