Déplacer la signature du constructeur

A partir de cette référence, il permet une const rvalue en tant que constructeur de déplacement

 Type::Type( const Type&& other ); 

Comment un object mobile peut-il être const ? Même si cela était techniquement autorisé, existe-t-il un cas où une telle déclaration serait utile?

Comment un object mobile peut-il être const ?

Cela ne peut pas, mais ce n’est pas ce que dit la langue. Le langage dit qu’un constructeur avec cette signature est un “constructeur de déplacement” mais cela ne signifie pas que l’argument est déplacé de, mais signifie simplement que le constructeur répond aux exigences d’un “constructeur de déplacement”. Un constructeur de déplacement n’est pas obligé de déplacer quoi que ce soit, et si l’argument est const il ne le peut pas.

Y a-t-il un cas où une telle déclaration serait utile?

Oui, mais pas très souvent. Cela peut être utile si vous souhaitez empêcher la sélection d’un autre constructeur par résolution de surcharge lorsqu’un temporaire temporaire est passé en tant qu’argument.

 struct Type { template Type(T&&); // accepts anything Type(const Type&) = default; Type(Type&&) = default; }; typedef const Type CType; CType func(); Type t( func() ); // calls Type(T&&) 

Dans ce code, le retour temporaire renvoyé par func() ne correspondra pas exactement aux parameters de constructeur de copie ou de déplacement. Le constructeur de modèle qui accepte n’importe quel type est donc appelé. Pour éviter cela, vous pouvez fournir une surcharge différente prenant une valeur constante et déléguer au constructeur de copie:

 Type(const Type&& t) : Type(t) { } 

Ou si vous souhaitez empêcher la compilation du code, définissez-le comme étant supprimé:

 Type(const Type&& t) = delete; 

Voir https://stackoverflow.com/a/4940642/981959 pour des exemples tirés de la norme qui utilisent une référence const rvalue.

Quelques informations sur l’intention de cette fonctionnalité.

Références Rvalue – Du blog de Bjarne Stroustrup

Une proposition pour append la prise en charge du déplacement de la sémantique au langage C ++

Une question intéressante. J’ai lu quelque part une explication de cette question de Stroustrup, mais je n’arrive pas à la retrouver. J’espère que ce qui précède aide à sa place.