Maison >développement back-end >C++ >Des éléments peuvent-ils être déplacés hors d'une « 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!