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

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