Maison >développement back-end >C++ >Des éléments peuvent-ils être déplacés hors d'une « std::initializer_list » ?

Des éléments peuvent-ils être déplacés hors d'une « std::initializer_list » ?

DDD
DDDoriginal
2024-12-20 14:10:14481parcourir

Can Elements Be Moved Out of a `std::initializer_list`?

initializer_list et Move Semantics

Le type initializer_list en C est souvent utilisé pour initialiser des conteneurs avec des listes de valeurs entre accolades. Cependant, contrairement aux conteneurs classiques, initializer_list ne suit pas la sémantique des valeurs. En conséquence, une question courante se pose :

Des éléments peuvent-ils être déplacés hors d'un std::initializer_list?

La réponse à cette question est non. Tenter de le faire entraînera des copies, même si l'élément déplacé est de type déplacement uniquement. En effet, les fonctions start() et end() de initializer_list renvoient des pointeurs vers des valeurs const. Lorsque std::move est appliqué à une valeur const, le résultat est une référence rvalue immuable, qui ne peut pas être déplacée de manière significative. Au lieu de cela, il se liera à un paramètre de fonction de type const T&, ce qui entraînera une sémantique de copie.

Ce comportement peut sembler inattendu, étant donné que initializer_list est destiné à stocker une liste d'objets temporaires. Cependant, on pense que rendre le type const ou mutable à la discrétion du compilateur permettrait une initialisation statique plus efficace de la liste.

Mise à jour : une proposition pour la prise en charge initializer_list des types Move-Only

En réponse aux commentaires, une proposition ISO a été rédigée pour fournir la prise en charge des types de déplacement uniquement dans initializer_list. Cette proposition est toujours en cours d'examen, mais elle offre une solution potentielle aux limitations actuelles de initializer_list lors de l'utilisation de types de déplacement uniquement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn