Maison > développement back-end > C++ > Les éléments peuvent-ils être déplacés d'une `initializer_list` C ?

Les éléments peuvent-ils être déplacés d'une `initializer_list` C ?

Barbara Streisand
Libérer: 2024-12-18 17:14:14
original
962 Les gens l'ont consulté

Can Elements Be Moved from a C   `initializer_list`?

Déplacer la sémantique et initializer_list

En C , une initializer_list est une séquence temporaire de valeurs de type T. Elle est couramment utilisée pour initialiser des tableaux et autres conteneurs. Cependant, une question se pose : les éléments peuvent-ils être déplacés hors d'une initializer_list ?

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

Réponse :

Malheureusement, le déplacement d'éléments hors d'une initializer_list ne se comportera pas comme prévu. Cela entraînera toujours des copies, même si on s'attend à ce que initializer_list contienne un tableau de temporaires jusqu'à ce qu'ils soient déplacés.

Cet écart provient du fait que initializer_list::begin() et initializer_list ::end() renvoie const T *. Le résultat du déplacement dans le code fourni donne un T const & &&, qui représente une référence rvalue immuable. On ne peut s’éloigner d’une telle expression. Il se lie à un paramètre de fonction de type T const & car les rvalues ​​se lient aux références const lvalue, conduisant à la préservation de la sémantique de copie.

La raison derrière cette limitation peut être de permettre au compilateur d'initialiser l'initializer_list ou const initializer_list, éliminant ainsi toute ambiguïté pour l'utilisateur concernant la nature const ou mutable des résultats begin() et end().

Néanmoins, une proposition d'extension du standard C a été proposée. pour résoudre cette limitation et autoriser initializer_list pour prendre en charge les types de déplacement uniquement. Bien qu'il en soit encore à ses premiers stades de développement, il suggère une exploration plus approfondie et une adoption de cette fonctionnalité à l'avenir.

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