std:: is_copy_assignable, std:: is_trivially_copy_assignable, std:: is_nothrow_copy_assignable
|
Défini dans l'en-tête
<type_traits>
|
||
|
template
<
class
T
>
struct is_copy_assignable ; |
(1) | (depuis C++11) |
|
template
<
class
T
>
struct is_trivially_copy_assignable ; |
(2) | (depuis C++11) |
|
template
<
class
T
>
struct is_nothrow_copy_assignable ; |
(3) | (depuis C++11) |
| Caractéristique de type |
Valeur de la constante membre
value
|
|
|---|---|---|
T
est un
type référençable
|
T
n'est pas un type référençable
|
|
| (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 | |
Si
T
n'est pas un type complet, (éventuellement qualifié cv)
void
, ou un tableau de limite inconnue, le comportement est indéfini.
Si une instanciation d'un template ci-dessus dépend, directement ou indirectement, d'un type incomplet, et que cette instanciation pourrait produire un résultat différent si ce type était hypothétiquement complété, le comportement est indéfini.
Si le programme ajoute des spécialisations pour l'un des modèles décrits sur cette page, le comportement est indéfini.
Table des matières |
Modèles de variables auxiliaires
|
template
<
class
T
>
inline
constexpr
bool
is_copy_assignable_v
=
|
(depuis C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_trivially_copy_assignable_v
=
|
(depuis C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_nothrow_copy_assignable_v
=
|
(depuis C++17) | |
Hérité de std:: integral_constant
Constantes membres
|
value
[static]
|
true
si
T
est copiable-assignable,
false
sinon
(constante membre publique statique) |
Fonctions membres
|
operator bool
|
convertit l'objet en
bool
, retourne
value
(fonction membre publique) |
|
operator()
(C++14)
|
retourne
value
(fonction membre publique) |
Types membres
| Type | Définition |
value_type
|
bool |
type
|
std:: integral_constant < bool , value > |
Implémentation possible
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> {}; |
` a été préservé intact - Les termes spécifiques au C++ n'ont pas été traduits - Aucun texte en dehors du code n'était présent à traduire
Notes
Le trait
std::is_copy_assignable
est moins strict que
CopyAssignable
car il ne vérifie pas le type du résultat de l'affectation (qui, pour un type
CopyAssignable
, doit être une lvalue de type
T
) et ne vérifie pas l'exigence sémantique que l'expression d'argument reste inchangée. Il ne vérifie pas non plus que
T
satisfait
MoveAssignable
, ce qui est requis pour tous les types
CopyAssignable
.
Exemple
#include <iostream> #include <type_traits> #include <utility> struct Foo { int n; }; int main() { std::cout << std::boolalpha << "Foo is trivially copy-assignable? " << std::is_trivially_copy_assignable<Foo>::value << '\n' << "int[2] is copy-assignable? " << std::is_copy_assignable<int[2]>::value << '\n' << "int is nothrow copy-assignable? " << std::is_nothrow_copy_assignable<int>::value << '\n'; }
Sortie :
Foo is trivially copy-assignable? true int[2] is copy-assignable? false int is nothrow copy-assignable? true
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2196 | C++11 | le comportement n'était pas clair si const T & ne peut pas être formé | la valeur produite est false dans ce cas |
Voir aussi
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un opérateur d'affectation pour un argument spécifique
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un opérateur d'affectation de déplacement
(modèle de classe) |