Maison >développement back-end >C++ >Comment `std::make_unique` réalise-t-il un transfert parfait en C ?

Comment `std::make_unique` réalise-t-il un transfert parfait en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-26 02:40:09344parcourir

How Does `std::make_unique` Achieve Perfect Forwarding in C  ?

make_unique et Perfect Forwarding

En C 11, il n'y a pas de fonction std::make_unique intégrée, qui permettrait une instanciation concise de pointeurs uniques. Les développeurs ont trouvé la syntaxe

std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));

inutilement verbeuse et ont proposé une syntaxe alternative :

auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);

Cette approche simplifie la création de pointeurs uniques et réduit la duplication de code.

L'implémentation proposée de std::make_unique utilise le transfert parfait via std::forward pour transmettre les arguments au constructeur. Le transfert parfait garantit que les paramètres de fonction sont transmis de la manière la plus efficace possible, en préservant leur type et leur catégorie de valeur d'origine (par exemple, lvalues, rvalues).

Dans l'implémentation make_unique, la syntaxe

std::forward<Args>(args)...

peut être interprété comme suit :

  • std::forward : tapez les traits qui déduire la catégorie de valeur (par exemple, lvalue ou rvalue) de Args.
  • args... : Expansion des arguments variables en paramètres individuels.

Ensemble, ils réalisent une transmission parfaite en s'assurer que les arguments sont transmis au constructeur avec la catégorie et le type de valeur corrects.

Herb Sutter, président du comité de normalisation C, a reconnu l'oubli de ne pas inclure std::make_unique dans C 11 et a indiqué qu'il sera ajouté dans une future version. L'implémentation suggérée est identique à celle fournie dans la question.

Avec l'introduction de C 14, std::make_unique a été standardisé, fournissant la syntaxe concise demandée pour créer des pointeurs uniques.

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