Espacios de nombres
Variantes
Acciones

std::is_copy_constructible, std::is_trivially_copy_constructible, std::is_nothrow_copy_constructible

De cppreference.com
< cpp‎ | types
 
 
Biblioteca de servicios
 
Apoyo de tipos
Tipos básicos
Tipos fundamentales
Tipos enteros de anchura fija (C++11)
Límites numéricos
Interfaz de C de límites numéricos
Información de tipo
en tiempo de ejecución
Rasgos de tipos
Categorías de tipos
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
Operaciones soportadas
is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
Relaciones y consultas de propiedades
Modificaciones de tipos
(C++11)(C++11)(C++11)
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
(C++11)(hasta C++20)(C++17)
 
Definido en el archivo de encabezado <type_traits>
template< class T >
struct is_copy_constructible;
(1) (desde C++11)
template< class T >
struct is_trivially_copy_constructible;
(2) (desde C++11)
template< class T >
struct is_nothrow_copy_constructible;
(3) (desde C++11)
1) Si T no es un tipo que pueda referenciarse (es decir void posiblemente calificado-cv o un tipo función con una secuencia de calificadores-cv o un calificador-ref ), proporciona una constante miembro value igual a false. De lo contrario, proporciona una constante miembro value igual a std::is_constructible<T, const T&>::value.
2) Lo mismo que (1), pero utiliza std::is_trivially_constructible<T, const T&>.
3) Lo mismo que (1), pero utiliza std::is_nothrow_constructible<T, const T&>.

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_copy_constructible_v = is_copy_constructible<T>::value;
(desde C++17)
template< class T >
inline constexpr bool is_trivially_copy_constructible_v = is_trivially_copy_constructible<T>::value;
(desde C++17)
template< class T >
inline constexpr bool is_nothrow_copy_constructible_v = is_nothrow_copy_constructible<T>::value;
(desde C++17)

Heredado de std::integral_constant

Constantes miembro

value
[estático]
true si T puede construirse por copia , 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_copy_constructible :
    std::is_constructible<T, typename std::add_lvalue_reference<
        typename std::add_const<T>::type>::type> {};
 
template<class T>
struct is_trivially_copy_constructible :
    std::is_trivially_constructible<T, typename std::add_lvalue_reference<
        typename std::add_const<T>::type>::type> {};
 
template<class T>
struct is_nothrow_copy_constructible :
    std::is_nothrow_constructible<T, typename std::add_lvalue_reference<
        typename std::add_const<T>::type>::type> {};

[editar] Notas

En varias implementaciones, is_nothrow_copy_constructible también comprueba si el destructor lanza porque es efectivamente noexcept(T(arg)). Lo mismo aplica a is_trivially_copy_constructible, que, en estas implementaciones, también requiere que el destructor sea trivial: GCC bug 51452, Asunto LWG 2116.

[editar] Ejemplo

#include <iostream>
#include <type_traits>
 
struct Ex1 {
    std::string str; // miembro tiene un ctor de copia no trivial
};
struct Ex2 {
    int n;
    Ex2(const Ex2&) = default; // trivial y no lanza
};
 
int main() {
    std::cout << std::boolalpha << "Ex1 puede construirse por copia? "
              << std::is_copy_constructible<Ex1>::value << '\n'
              << "Ex1 puede construirse trivialmente por copia? "
              << std::is_trivially_copy_constructible<Ex1>::value << '\n'
              << "Ex2 puede construirse trivialmente por copia? "
              << std::is_trivially_copy_constructible<Ex2>::value << '\n'
              << "Ex2 es nothrow y puede construirse por copia? "
              << std::is_nothrow_copy_constructible<Ex2>::value << '\n';
}

Salida:

Ex1 puede construirse por copia? true
Ex1 puede construirse trivialmente por copia? false
Ex2 puede construirse trivialmente por copia? true
Ex2 es nothrow y puede construirse por copia? true

[editar] Véase también

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) [editar]
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) [editar]
Comprueba si un tipo tiene un constructor de movimiento
Original:
checks if a type has a move 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) [editar]