std:: is_copy_constructible, std:: is_trivially_copy_constructible, std:: is_nothrow_copy_constructible
|
Definido en el 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) |
| Rasgo de tipo |
El valor de la constante miembro
value
|
|
|---|---|---|
T
es un
tipo referenciable
|
T
no es un tipo referenciable
|
|
| (1) | std:: is_constructible < T, const T & > :: value | false |
| (2) | std:: is_trivially_constructible < T, const T & > :: value | |
| (3) | std:: is_nothrow_constructible < T, const 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 es indefinido.
Contenidos |
Plantillas de variables auxiliares
|
template
<
class
T
>
inline
constexpr
bool
is_copy_constructible_v
=
|
(desde C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_trivially_copy_constructible_v
=
|
(desde C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_nothrow_copy_constructible_v
=
|
(desde C++17) | |
Heredado de std:: integral_constant
Constantes miembro
|
value
[static]
|
true
si
T
es copiable,
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_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> {}; |
Notas
En muchas implementaciones,
is_nothrow_copy_constructible
también verifica si el destructor lanza excepciones porque efectivamente es
noexcept
(
T
(
arg
)
)
. Lo mismo aplica para
is_trivially_copy_constructible
, que en estas implementaciones también requiere que el destructor sea trivial:
GCC bug 51452
,
LWG issue 2116
.
Ejemplo
#include <string> #include <type_traits> struct S1 { std::string str; // el miembro tiene un constructor de copia no trivial }; static_assert(std::is_copy_constructible_v<S1>); static_assert(!std::is_trivially_copy_constructible_v<S1>); struct S2 { int n; S2(const S2&) = default; // trivial y no lanzador de excepciones }; static_assert(std::is_trivially_copy_constructible_v<S2>); static_assert(std::is_nothrow_copy_constructible_v<S2>); struct S3 { S3(const S3&) = delete; // explícitamente eliminado }; static_assert(!std::is_copy_constructible_v<S3>); struct S4 { S4(S4&) {}; // no puede enlazar const, por lo tanto no es copiable }; static_assert(!std::is_copy_constructible_v<S4>); int main() {}
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2196 | C++11 | el comportamiento no estaba claro si const T & no puede formarse | el valor producido es false en este caso |
Véase también
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un constructor para argumentos específicos
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo tiene un constructor por defecto
(plantilla de clase) |
|
(C++11)
(C++11)
(C++11)
|
verifica si un tipo puede ser construido desde una referencia a valor temporal
(plantilla de clase) |
|
(C++20)
|
especifica que un objeto de un tipo puede ser copiado y movido mediante construcción
(concepto) |