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!