En C , une liste d'initialiseurs, notée std::initializer_list
Dans l'extrait de code ci-dessous, une fonction foo accepte une liste d'initialiseurs comme argument :
#include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // Intended to move the element } }
Le problème survient car std::initializer_list
Malheureusement, l'attente d'un mouvement fluide des éléments est infondée. Une tentative de déplacement d'éléments d'une liste d'initialisation produira des résultats inattendus. Au lieu de déplacer les éléments, des copies sont créées. Ce comportement provient du fait que les fonctions de début et de fin dans std::initializer_list
Par conséquent, l'expression de déplacement utilisée dans bar(std::move(*it)) se lie à un paramètre de fonction de type T const &, préservant efficacement les copies.
La raison de cette limitation est attribuée à la prérogative du compilateur d'instancier std::initializer_list en tant que constante initialisée statiquement. Autoriser les résultats mutables du début à la fin entraverait cette optimisation, introduisant de la complexité dans la conception du compilateur.
Malgré le comportement inattendu, une solution pourrait se profiler à l'horizon. Une [proposition ISO](https://github.com/CaseyCarter/iso-changes/blob/master/icpp/p1716r4.md) cherche à introduire la prise en charge de la liste d'initialisation pour les types de déplacement uniquement. Cet effort vise à améliorer les capacités du langage et à fournir une approche plus cohérente du travail avec les listes d'initialisation et la sémantique de déplacement.
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!