Maison > développement back-end > C++ > Pouvez-vous déplacer des éléments hors d'une std::initializer_list ?

Pouvez-vous déplacer des éléments hors d'une std::initializer_list ?

Patricia Arquette
Libérer: 2024-12-26 00:49:09
original
1011 Les gens l'ont consulté

Can You Move Elements Out of a std::initializer_list?

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? Examinons cela plus en détail.

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?
    }
}
Copier après la connexion

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!

Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal