Namespaces
Variants

std:: is_move_assignable, std:: is_trivially_move_assignable, std:: is_nothrow_move_assignable

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
is_move_assignable is_trivially_move_assignable is_nothrow_move_assignable
(C++11) (C++11) (C++11)

Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Определено в заголовочном файле <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 =

is_move_assignable < T > :: value ;
(начиная с C++17)
template < class T >

inline constexpr bool is_trivially_move_assignable_v =

is_trivially_move_assignable < T > :: value ;
(начиная с C++17)
template < class T >

inline constexpr bool is_nothrow_move_assignable_v =

is_nothrow_move_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_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> {};
**Примечание:** Весь код C++ внутри тегов `
` и `` оставлен без изменений, как и требовалось. 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 в этом случае

Смотрите также

проверяет, имеет ли тип оператор присваивания для конкретного аргумента
(шаблон класса)
проверяет, имеет ли тип оператор копирующего присваивания
(шаблон класса)