std::is_move_assignable, std::is_trivially_move_assignable, std::is_nothrow_move_assignable
Definido en el archivo de 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) |
T
no es un tipo que pueda referenciarse (p. ej., posiblemente void calificado-cv o un tipo función con una secuencia de calificadores-cv o un calificador-ref), proporciona la constante miembro value
igual a false. De lo contrario, proporciona la constante miembro value
igual a std::is_assignable<T&, T&&>::value.T
deberá ser un tipo completo, (posiblemente calificado-cv) void, o un array de límite desconocido. De lo contrario, el comportamiento está indefinido.
Si la instanciación de una plantilla anterior depende, directa o indirectamente, de un tipo incompleto, y esa instanciación podría generar un resultado distinto si ese tipo hipotéticamente se completara, el comportamiento está indefinido.
El comportamiento de un programa que añade especializaciones para cualquiera de las plantillas definidas en esta página no está definido.
Contenido |
[editar] Plantillas de variable 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 [estático] |
true si T is asignable por movimiento, de lo contrario false. (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> |
[editar] Posible implementación
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> {}; |
[editar] Notas
El rasgo std::is_move_assignable
es menos estricto que MoveAssignable porque no comprueba el tipo del resultado de la asignación (que, para un tipo MoveAssignable, debe ser T&
), ni el requerimiento semántico que el valor del destino después de la asignación sea equivalente al valor de la fuente antes de la asignación.
El tipo no tiene que implementar un operador de asignación de movimiento para poder satisfacer este rasgo; véase MoveAssignable para más detalles.
[editar] Ejemplo
#include <iostream> #include <string> #include <type_traits> struct Foo { int n; }; struct NoMove { // previene la declaración implícita del operador de asignación // de movimiento por defecto; sin embargo, la clase todavía es // asignable por movimiento porque su operador de // asignación de copia puede vincularse a un argumento rvalue NoMove& operator=(const NoMove&) { return *this; } }; int main() { std::cout << std::boolalpha << "std::string es nothrow asignable por movimiento? " << std::is_nothrow_move_assignable<std::string>::value << '\n' << "int[2] es asignable por movimiento? " << std::is_move_assignable<int[2]>::value << '\n' << "Foo es trivialmente asignable por movimiento? " << std::is_trivially_move_assignable<Foo>::value << '\n'; std::cout << std::boolalpha << "NoMove es asignable por movimiento? " << std::is_move_assignable<NoMove>::value << '\n' << "NoMove is nothrow move-assignable? " << std::is_nothrow_move_assignable<NoMove>::value << '\n'; }
Salida:
std::string es nothrow asignable por movimiento? true int[2] es asignable por movimiento? false Foo es trivialmente asignable por movimiento? true NoMove es asignable por movimiento? true NoMove es nothrow asignable por movimiento? false
[editar] Véase también
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un operador de asignación para un argumento específico Original: checks if a type has a assignment operator for a specific argument The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un operador de asignación de copia Original: checks if a type has a copy assignment operator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (plantilla de clase) |