std:: is_copy_constructible, std:: is_trivially_copy_constructible, std:: is_nothrow_copy_constructible
|
Défini dans l'en-tête
<type_traits>
|
||
|
template
<
class
T
>
struct is_copy_constructible ; |
(1) | (depuis C++11) |
|
template
<
class
T
>
struct is_trivially_copy_constructible ; |
(2) | (depuis C++11) |
|
template
<
class
T
>
struct is_nothrow_copy_constructible ; |
(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_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
n'est pas un type complet, (éventuellement qualifié cv)
void
, ou un tableau de limite inconnue, le comportement est indéfini.
Si l'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 d'assistance
|
template
<
class
T
>
inline
constexpr
bool
is_copy_constructible_v
=
|
(depuis C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_trivially_copy_constructible_v
=
|
(depuis C++17) | |
|
template
<
class
T
>
inline
constexpr
bool
is_nothrow_copy_constructible_v
=
|
(depuis C++17) | |
Hérité de std:: integral_constant
Constantes membres
|
value
[static]
|
true
si
T
est copiable,
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_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> {}; |
Notes
Dans de nombreuses implémentations,
is_nothrow_copy_constructible
vérifie également si le destructeur lève des exceptions car il est effectivement
noexcept
(
T
(
arg
)
)
. La même chose s'applique à
is_trivially_copy_constructible
, qui, dans ces implémentations, exige également que le destructeur soit trivial :
Bug GCC 51452
,
Problème LWG 2116
.
Exemple
#include <string> #include <type_traits> struct S1 { std::string str; // le membre a un constructeur de copie non 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 et non-lançant }; static_assert(std::is_trivially_copy_constructible_v<S2>); static_assert(std::is_nothrow_copy_constructible_v<S2>); struct S3 { S3(const S3&) = delete; // explicitement supprimé }; static_assert(!std::is_copy_constructible_v<S3>); struct S4 { S4(S4&) {}; // ne peut pas lier const, donc pas de constructeur de copie }; static_assert(!std::is_copy_constructible_v<S4>); int main() {}
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 a un constructeur pour des arguments spécifiques
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type a un constructeur par défaut
(modèle de classe) |
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type peut être construit à partir d'une référence rvalue
(modèle de classe) |
|
(C++20)
|
spécifie qu'un objet d'un type peut être copié et déplacé par construction
(concept) |