Maison >développement back-end >C++ >Que signifie vraiment la double esperluette (T&&) dans C 11 ?

Que signifie vraiment la double esperluette (T&&) dans C 11 ?

DDD
DDDoriginal
2024-12-19 14:25:13660parcourir

What Does the Double Ampersand (T&&) in C  11 Really Mean?

Démystifier la double esperluette (T&&) dans C 11

Au premier plan des nouveautés de C 11 se trouve la double esperluette (&&), souvent vu dans les déclarations de variables telles que T&& var. Mais que représente exactement cette syntaxe énigmatique ?

Introduction aux références Rvalue

La double esperluette déclare une référence rvalue, telle que définie dans le document de proposition de normes. Contrairement aux références traditionnelles (maintenant appelées références lvalue en C 11), qui ne peuvent se lier qu'à des lvalues ​​(objets nommés), les références rvalue peuvent se lier à des rvalues, y compris temporaires.

Différences clés par rapport aux références Lvalue

La principale distinction entre les références rvalue et les références lvalue est que les références rvalue peuvent se lier aux rvalues ​​sans nécessiter le const mot-clé. Cela permet la syntaxe juridique suivante :

T&& r = T();

Avantages des références Rvalue

Les références Rvalue offrent plusieurs avantages significatifs :

1. Sémantique de déplacement :

Les références Rvalue facilitent la mise en œuvre de constructeurs de déplacement et d'opérateurs d'affectation de déplacement, qui permettent une relocalisation efficace des ressources sans avoir à copier des données inutilement.

2. Transfert parfait :

Avec les références rvalue, les fonctions de modèle peuvent transmettre correctement les arguments, en préservant leur statut lvalue ou rvalue, conduisant à un code plus polyvalent et maintenable.

Propriétés de Rvalue Références :

  • La résolution de surcharge favorise les références lvalue pour les lvalues ​​et les références rvalue pour rvalues.
  • Les références Rvalue peuvent se lier à des valeurs temporaires résultant de conversions implicites.
  • Les références rvalue nommées sont des lvalues, tandis que les références rvalue non nommées sont des rvalues.

Exemple : Déplacer la sémantique

Considérez la copie suivante constructeur :

foo(foo const& other) {
  this->length = other.length;
  this->ptr = new int[other.length];
  copy(other.ptr, other.ptr + other.length, this->ptr);
}

Ce constructeur de copie pourrait être amélioré en prenant une référence rvalue dans un constructeur de déplacement, qui modifie son argument :

foo(foo&& other) {
  this->length = other.length;
  this->ptr = other.ptr;
  other.length = 0;
  other.ptr = nullptr;
}

Ce constructeur de déplacement "déplace" efficacement le temporaire dans l'objet nouvellement construit, en évitant les copie.

Conclusion :

Les références Rvalue, désignées par la double esperluette (&&), étendent les capacités de C en introduisant une syntaxe spécifique à rvalue. Ils permettent une sémantique de déplacement, un transfert parfait et une efficacité améliorée dans la gestion des objets temporaires, renforçant ainsi leur importance dans la programmation C moderne.

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:
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