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 не является полным типом, типом void (возможно, cv-квалифицированным) или массивом неизвестной границы, поведение не определено.
Если инстанцирование приведённого выше шаблона прямо или косвенно зависит от неполного типа, и это инстанцирование могло бы дать другой результат, если бы этот тип гипотетически был завершён, поведение не определено.
Если программа добавляет специализации для любых шаблонов, описанных на этой странице, поведение не определено.
Вспомогательные шаблоны переменных
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++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2196 | C++11 | поведение было неясным, если constT& нельзя сформировать | в этом случае полученное значение равно false |
См. также
|
(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/cpp/types/is_copy_assignable