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) |
| Тип-признак |
Значение константы-члена
value
|
|
|---|---|---|
T
является
ссылочным типом
|
T
не является ссылочным типом
|
|
| (1) | std:: is_assignable < T & , const T & > :: value | false |
| (2) | std:: is_trivially_assignable < T & , const T & > :: value | |
| (3) | std:: is_nothrow_assignable < T & , const T & > :: value | |
Если
T
не является полным типом, (возможно, с cv-квалификаторами)
void
, или массивом неизвестной границы, поведение не определено.
Если создание экземпляра шаблона выше зависит, прямо или косвенно, от неполного типа, и это создание экземпляра может дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.
Если программа добавляет специализации для любых шаблонов, описанных на этой странице, поведение не определено.
Содержание |
Вспомогательные шаблоны переменных
|
template
<
class
T
>
inline
constexpr
bool
is_copy_assignable_v
=
|
(начиная с C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_trivially_copy_assignable_v
=
|
(начиная с C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_nothrow_copy_assignable_v
=
|
(начиная с 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> {}; |
` и `` оставлен без изменений, как и требовалось. HTML-разметка и атрибуты также сохранены в оригинальном виде.
Примечания
Трейт
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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2196 | C++11 | поведение было неясным, если const T & не может быть сформирован | производимое значение равно false в этом случае |
Смотрите также
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип оператор присваивания для конкретного аргумента
(шаблон класса) |
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип оператор перемещающего присваивания
(шаблон класса) |