Listes d'initialisation et sémantique de déplacement : puis-je déplacer des éléments ?
Une question se pose concernant l'utilisation des listes d'initialisation et la sémantique de déplacement : est-il permis de déplacer des éléments hors d'un std::initializer_list
Le problème
Considérez l'extrait de code suivant :
#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)); // kosher? } }
Ici, nous voulons vérifier s'il est possible de déplacer des éléments hors d'un std::initializer_list.
Le Réponse
Étonnamment, la réponse est non. L'expression std::move(*it) n'entraînera pas de déplacement. Au lieu de cela, il produit une référence rvalue immuable de type T const &&. En effet, les méthodes start et end d'initializer_list renvoient const T *, ce qui ne permet pas la sémantique de déplacement.
La raison probable en est de permettre au compilateur de créer initializer_list en tant que constante initialisée statiquement. Cependant, il serait plus intuitif que start et end renvoient initializer_list ou const initializer_list, selon la discrétion du compilateur.
Autres considérations
Une proposition ISO a été conçu pour fournir la prise en charge de initializer_list pour les types de déplacement uniquement. Cette proposition, bien qu'encore à ses débuts, répond à la question soulevée ici.
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!