Namespaces
Variants

std:: is_move_constructible, std:: is_trivially_move_constructible, std:: is_nothrow_move_constructible

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Défini dans l'en-tête <type_traits>
template < class T >
struct is_move_constructible ;
(1) (depuis C++11)
template < class T >
struct is_trivially_move_constructible ;
(2) (depuis C++11)
template < class T >
struct is_nothrow_move_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, T && > :: value false
(2) std:: is_trivially_constructible < T, T && > :: value
(3) std:: is_nothrow_constructible < T, 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_move_constructible_v =

is_move_constructible < T > :: value ;
(depuis C++17)
template < class T >

inline constexpr bool is_trivially_move_constructible_v =

is_trivially_move_constructible < T > :: value ;
(depuis C++17)
template < class T >

inline constexpr bool is_nothrow_move_constructible_v =

is_nothrow_move_constructible < T > :: value ;
(depuis C++17)

Hérité de std:: integral_constant

Constantes membres

value
[static]
true si T est déplaçable-constructible, 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_move_constructible :
    std::is_constructible<T, typename std::add_rvalue_reference<T>::type> {};
template<class T>
struct is_trivially_move_constructible :
    std::is_trivially_constructible<T, typename std::add_rvalue_reference<T>::type> {};
template<class T>
struct is_nothrow_move_constructible :
    std::is_nothrow_constructible<T, typename std::add_rvalue_reference<T>::type> {};

Notes

Les types sans constructeur de déplacement, mais avec un constructeur de copie qui accepte const T & arguments, satisfont std::is_move_constructible .

Les constructeurs de déplacement sont généralement noexcept, car sinon ils sont inutilisables dans tout code qui fournit une garantie d'exception forte.

Dans de nombreuses implémentations, std::is_nothrow_move_constructible vérifie également si le destructeur lève des exceptions car il est effectivement noexcept ( T ( arg ) ) . La même chose s'applique à std::is_trivially_move_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 Ex1
{
    std::string str; // le membre a un constructeur de déplacement non trivial mais non lançant d'exception
};
static_assert(std::is_move_constructible_v<Ex1>);
static_assert(!std::is_trivially_move_constructible_v<Ex1>);
static_assert(std::is_nothrow_move_constructible_v<Ex1>);
struct Ex2
{
    int n;
    Ex2(Ex2&&) = default; // trivial et non lançant d'exception
};
static_assert(std::is_move_constructible_v<Ex2>);
static_assert(std::is_trivially_move_constructible_v<Ex2>);
static_assert(std::is_nothrow_move_constructible_v<Ex2>);
struct NoMove1
{
    // empêche la déclaration implicite du constructeur de déplacement par défaut ;
    // cependant, la classe reste déplaçable car son
    // constructeur de copie peut lier un argument rvalue
    NoMove1(const NoMove1&) {}
};
static_assert(std::is_move_constructible_v<NoMove1>);
static_assert(!std::is_trivially_move_constructible_v<NoMove1>);
static_assert(!std::is_nothrow_move_constructible_v<NoMove1>);
struct NoMove2
{
    // Non déplaçable car la référence lvalue
    // ne peut pas lier l'argument rvalue
    NoMove2(NoMove2&) {}
};
static_assert(!std::is_move_constructible_v<NoMove2>);
static_assert(!std::is_trivially_move_constructible_v<NoMove2>);
static_assert(!std::is_nothrow_move_constructible_v<NoMove2>);
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 S'applique à Comportement publié Comportement corrigé
LWG 2196 C++11 le comportement n'était pas clair si T && ne peut pas être formé la valeur produite est false dans ce cas

Voir aussi

vérifie si un type a un constructeur pour des arguments spécifiques
(modèle de classe)
vérifie si un type a un constructeur par défaut
(modèle de classe)
vérifie si un type a un constructeur de copie
(modèle de classe)
spécifie qu'un objet d'un type peut être construit par déplacement
(concept)
(C++11)
convertit l'argument en xvalue
(modèle de fonction)
convertit l'argument en xvalue si le constructeur de déplacement ne lève pas d'exception
(modèle de fonction)