std:: is_move_assignable, std:: is_trivially_move_assignable, std:: is_nothrow_move_assignable
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
T
>
struct is_move_assignable ; |
(1) | (начиная с C++11) |
|
template
<
class
T
>
struct is_trivially_move_assignable ; |
(2) | (начиная с C++11) |
|
template
<
class
T
>
struct is_nothrow_move_assignable ; |
(3) | (начиная с C++11) |
| Типовой признак |
Значение константы-члена
value
|
|
|---|---|---|
T
является
ссылочным типом
|
T
не является ссылочным типом
|
|
| (1) | std:: is_assignable < T & , T && > :: value | false |
| (2) | std:: is_trivially_assignable < T & , T && > :: value | |
| (3) | std:: is_nothrow_assignable < T & , T && > :: value | |
Если
T
не является полным типом, (возможно, с квалификаторами cv)
void
, или массивом неизвестной границы, поведение не определено.
Если создание экземпляра шаблона выше зависит, прямо или косвенно, от неполного типа, и это создание экземпляра может дать другой результат, если бы этот тип был гипотетически завершен, поведение не определено.
Если программа добавляет специализации для любых шаблонов, описанных на этой странице, поведение не определено.
Содержание |
Вспомогательные шаблоны переменных
|
template
<
class
T
>
inline
constexpr
bool
is_move_assignable_v
=
|
(начиная с C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_trivially_move_assignable_v
=
|
(начиная с C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_nothrow_move_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_move_assignable : std::is_assignable<typename std::add_lvalue_reference<T>::type, typename std::add_rvalue_reference<T>::type> {}; template<class T> struct is_trivially_move_assignable : std::is_trivially_assignable<typename std::add_lvalue_reference<T>::type, typename std::add_rvalue_reference<T>::type> {}; template<class T> struct is_nothrow_move_assignable : std::is_nothrow_assignable<typename std::add_lvalue_reference<T>::type, typename std::add_rvalue_reference<T>::type> {}; |
` и `` оставлен без изменений, как и требовалось. HTML-разметка и атрибуты также сохранены в оригинальном виде.
Примечания
Трейт
std::is_move_assignable
менее строгий, чем
MoveAssignable
, поскольку он не проверяет тип результата присваивания (который для
MoveAssignable
типа должен быть
T&
), а также семантическое требование, что значение цели после присваивания должно быть эквивалентно значению источника до присваивания.
Типу не обязательно реализовывать оператор перемещающего присваивания для соответствия этой характеристике; подробности смотрите в MoveAssignable .
Пример
#include <iostream> #include <string> #include <type_traits> struct Foo { int n; }; struct NoMove { // prevents implicit declaration of default move assignment operator // however, the class is still move-assignable because its // copy assignment operator can bind to an rvalue argument NoMove& operator=(const NoMove&) { return *this; } }; int main() { std::cout << std::boolalpha << "std::string is nothrow move-assignable? " << std::is_nothrow_move_assignable<std::string>::value << '\n' << "int[2] is move-assignable? " << std::is_move_assignable<int[2]>::value << '\n' << "Foo is trivially move-assignable? " << std::is_trivially_move_assignable<Foo>::value << '\n' << "NoMove is move-assignable? " << std::is_move_assignable<NoMove>::value << '\n' << "NoMove is nothrow move-assignable? " << std::is_nothrow_move_assignable<NoMove>::value << '\n'; }
Вывод:
std::string is nothrow move-assignable? true int[2] is move-assignable? false Foo is trivially move-assignable? true NoMove is move-assignable? true NoMove is nothrow move-assignable? false
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 2196 | C++11 | поведение было неясным, если T && не может быть сформирован | производимое значение равно false в этом случае |
Смотрите также
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип оператор присваивания для конкретного аргумента
(шаблон класса) |
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип оператор копирующего присваивания
(шаблон класса) |