std::is_move_constructible, std::is_trivially_move_constructible, std::is_nothrow_move_constructible
Definido en el archivo de encabezado <type_traits>
|
||
template< class T > struct is_move_constructible; |
(1) | (desde C++11) |
template< class T > struct is_trivially_move_constructible; |
(2) | (desde C++11) |
template< class T > struct is_nothrow_move_constructible; |
(3) | (desde C++11) |
T
no es un tipo referenciable (p. ej., posiblemente void calificado-cv o un tipo función con una secuencia de calificadores-cv o calificadores-ref), proporciona la constante miembro value
igual a false. De lo contrario, proporciona la constante miembro value
igual a std::is_constructible<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_constructible_v = is_move_constructible<T>::value; |
(desde C++17) | |
template< class T > inline constexpr bool is_trivially_move_constructible_v = is_trivially_move_constructible<T>::value; |
(desde C++17) | |
template< class T > inline constexpr bool is_nothrow_move_constructible_v = is_nothrow_move_constructible<T>::value; |
(desde C++17) | |
Heredado de std::integral_constant
Constantes miembro
value [estático] |
true si T se puede construir mediante 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_constructible : std::is_constructible<T, typename std::add_rvalue_reference<T>::type> {}; template<class T> struct is_trivially_move_constructible : std::is_trivially_constructible<T, typename std::add_rvalue_reference<T>::type> {}; template<class T> struct is_nothrow_move_constructible : std::is_nothrow_constructible<T, typename std::add_rvalue_reference<T>::type> {}; |
[editar] Notas
Los tipos sin un constructor de movimiento, pero con un constructor de copia que acepta argumentos const T&
, satisface std::is_move_constructible
.
Los constructores de movimiento habitualmente son noexcept
, ya que de lo contrario no serían usables en ningún código que proporciona la garantía de excepción fuerte/rígida.
En muchas implementaciones, is_nothrow_move_constructible
también comprueba si el destructor lanza porque efectivamente es noexcept(T(arg)). Lo mismo aplica a is_trivially_move_constructible
, que en estas implementaciones también requiere que el destructor sea trivial: GCC error de programación 51452, Asunto LWG 2116.
[editar] Ejemplo
#include <iostream> #include <type_traits> struct Ex1 { std::string str; // miembro tiene ctor no trivial pero que no lanza }; struct Ex2 { int n; Ex2(Ex2&&) = default; // trivial and que no lanza }; struct NoMove { // previene la declaración implícita del ctor de movimiento por defecto // sin embargo, la clase todavía es construible por movimiento porque su // ctor de copia puede vincularse a un argumento rvalue NoMove(const NoMove&) {} }; int main() { std::cout << std::boolalpha << "Ex1 es construible por movimiento? " << std::is_move_constructible<Ex1>::value << '\n' << "Ex1 es trivialmente construible por movimiento? " << std::is_trivially_move_constructible<Ex1>::value << '\n' << "Ex1 es nothrow construible por movimiento? " << std::is_nothrow_move_constructible<Ex1>::value << '\n' << "Ex2 es trivialmente construible por movimiento? " << std::is_trivially_move_constructible<Ex2>::value << '\n' << "Ex2 es nothrow construible por movimiento? " << std::is_nothrow_move_constructible<Ex2>::value << '\n'; std::cout << std::boolalpha << "NoMove es construible por movimiento? " << std::is_move_constructible<NoMove>::value << '\n' << "NoMove es nothrow construible por movimiento? " << std::is_nothrow_move_constructible<NoMove>::value << '\n'; }
Salida:
Ex1 es construible por movimiento? true Ex1 es trivialmente construible por movimiento? false Ex1 es nothrow construible por movimiento? true Ex2 es trivialmente construible por movimiento? true Ex2 es nothrow construible por movimiento? true NoMove es construible por movimiento? true NoMove es nothrow construible por movimiento? false
[editar] Véase también
(C++11)(C++11)(C++11) |
Comprueba si un tipo tiene un constructor de argumentos concretos Original: checks if a type has a constructor for specific arguments 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) |
Comprueba si un tipo tiene un constructor por defecto Original: checks if a type has a default constructor 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 constructor de copia Original: checks if a type has a copy constructor 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) |
Obtiene una referencia r-valor (plantilla de función) |
(C++11) |
Obtiene una referencia r-valor si el constructor de movimiento no lanza una excepción (plantilla de función) |