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
Definido en el encabezado <type_traits>
template < class T >
struct is_move_assignable ;
(1) (desde C++11)
template < class T >
struct is_trivially_move_assignable ;
(2) (desde C++11)
template < class T >
struct is_nothrow_move_assignable ;
(3) (desde C++11)
Rasgo de tipo El valor de la constante miembro value
T es un tipo referenciable T no es un tipo referenciable
(1) std:: is_assignable < T & , T && > :: value false
(2) std:: is_trivially_assignable < T & , T && > :: value
(3) std:: is_nothrow_assignable < T & , T && > :: value

Si T no es un tipo completo, (posiblemente calificado cv) void , o un array de límite desconocido, el comportamiento es indefinido.

Si una instanciación de una plantilla anterior depende, directa o indirectamente, de un tipo incompleto, y esa instanciación podría producir un resultado diferente si ese tipo se completara hipotéticamente, el comportamiento no está definido.

Si el programa añade especializaciones para cualquiera de las plantillas descritas en esta página, el comportamiento no está definido.

Contenidos

Plantillas de variables auxiliares

template < class T >

inline constexpr bool is_move_assignable_v =

is_move_assignable < T > :: value ;
(desde C++17)
template < class T >

inline constexpr bool is_trivially_move_assignable_v =

is_trivially_move_assignable < T > :: value ;
(desde C++17)
template < class T >

inline constexpr bool is_nothrow_move_assignable_v =

is_nothrow_move_assignable < T > :: value ;
(desde C++17)

Heredado de std:: integral_constant

Constantes miembro

value
[static]
true si T es asignable por movimiento, false en caso contrario
(constante miembro pública estática)

Funciones miembro

operator bool
convierte el objeto a bool , devuelve value
(función miembro pública)
operator()
(C++14)
devuelve value
(función miembro pública)

Tipos miembro

Tipo Definición
value_type bool
type std:: integral_constant < bool , value >

Implementación posible

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> {};

Notas

El rasgo std::is_move_assignable es menos estricto que MoveAssignable porque no verifica el tipo del resultado de la asignación (que, para un tipo MoveAssignable , debe ser T& ), ni el requisito semántico de que el valor del destino después de la asignación sea equivalente al valor del origen antes de la asignación.

El tipo no necesita implementar un operador de asignación de movimiento para satisfacer este rasgo; consulte MoveAssignable para más detalles.

Ejemplo

#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';
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2196 C++11 el comportamiento no estaba claro si T && no puede formarse el valor producido es false en este caso

Véase también

verifica si un tipo tiene un operador de asignación para un argumento específico
(plantilla de clase)
verifica si un tipo tiene un operador de asignación por copia
(plantilla de clase)