Espacios de nombres
Variantes
Acciones

std::is_copy_assignable, std::is_trivially_copy_assignable, std::is_nothrow_copy_assignable

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_assignableis_trivially_copy_assignableis_nothrow_copy_assignable
(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_assignable;
(1) (desde C++11)
template< class T >
struct is_trivially_copy_assignable;
(2) (desde C++11)
template< class T >
struct is_nothrow_copy_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&, const T&>::value false
(2) std::is_trivially_assignable<T&, const T&>::value
(3) std::is_nothrow_assignable<T&, const 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_copy_assignable_v =

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

inline constexpr bool is_trivially_copy_assignable_v =

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

inline constexpr bool is_nothrow_copy_assignable_v =

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

Heredado de std::integral_constant

Constantes miembro

value
[estático]
true si T as asignable 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_assignable
    : std::is_assignable<typename std::add_lvalue_reference<T>::type,
                         typename std::add_lvalue_reference<const T>::type> {};
 
template<class T>
struct is_trivially_copy_assignable
    : std::is_trivially_assignable<typename std::add_lvalue_reference<T>::type,
                                   typename std::add_lvalue_reference<const T>::type> {};
 
template<class T>
struct is_nothrow_copy_assignable
    : std::is_nothrow_assignable<typename std::add_lvalue_reference<T>::type,
                                 typename std::add_lvalue_reference<const T>::type> {};

[editar] Notas

El rasgo std::is_copy_assignable es menos estricto que CopyAssignable porque no comprueba el tipo del resultado de la asignación (que, para un tipo CopyAssignable, debe ser un l-valor de tipo T) y no comprueba el requisito semántico que la expresión argumento permanezca sin cambio. Tampoco comprueba que T satisfaga MoveAssignable, que se requiere para todos los tipos CopyAssignable.

[editar] Ejemplo

#include <iostream>
#include <utility>
#include <type_traits>
 
struct Foo { int n; };
 
int main()
{
    std::cout << std::boolalpha
              << "Foo es trivialmente asignable por copia? "
              << std::is_trivially_copy_assignable<Foo>::value << '\n'
              << "int[2] es asignable por copia? "
              << std::is_copy_assignable<int[2]>::value << '\n'
              << "int es nothrow asignable por copia? "
              << std::is_nothrow_copy_assignable<int>::value << '\n';
}

Salida:

Foo es trivialmente asignable por copia? true
int[2] es asignable por copia? false
int es nothrow asignable por copia? true

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 2196 C++11 El comportamiento no estaba claro si const T& no podía formarse. El valor producido es false en este caso.

[editar] Véase también

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