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
971 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!

source:php.cn
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