Maison > développement back-end > C++ > le corps du texte

Lors de l'utilisation de \'auto\' en C 11, comment détermine-t-il si une variable est une référence ou une valeur ?

Susan Sarandon
Libérer: 2024-11-04 11:24:02
original
1000 Les gens l'ont consulté

When using

Déduction de type "auto" C 11 : résolution de la référence par rapport à la valeur

En C 11, le mot-clé "auto" offre un moyen pratique pour déduire automatiquement le type d'une variable. Cependant, lorsque vous utilisez « auto », il est essentiel de comprendre les règles qui déterminent s'il se résout en une valeur ou une référence.

Type de règles de déduction pour « auto » :

La règle fondamentale est que "auto" interprète la déclaration de la variable elle-même, et non le type qu'elle représente. Par conséquent, l'exemple suivant démontre clairement que « auto » se résout en une valeur :

<code class="cpp">auto i = v.begin(); // Copy, as begin() returns an iterator by value</code>
Copier après la connexion

Cependant, dans des scénarios plus complexes, la distinction peut être moins apparente. Considérons les exemples suivants :

  • Cas 1 : Référence ou copie ?
<code class="cpp">const std::shared_ptr<Foo>&amp; get_foo();
auto p = get_foo(); // Copy or reference?</code>
Copier après la connexion

Dans ce cas, "auto" déduit le type de le type de retour de la fonction get_foo(), qui est une référence à un std::shared_ptr. Puisque la déclaration de p utilise une seule esperluette (&), elle se résout en une copie, pas une référence.

  • Cas 2 : Variable statique - Copie ou référence ?
<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
Copier après la connexion

Ici, "auto" déduit le type de la déclaration de s_foo, qui est un std::shared_ptr statique. Puisqu'il n'y a pas d'esperluette dans la déclaration de sp, elle se résout à nouveau en une copie.

  • Cas 3 : boucle sur un conteneur - copie pour chaque itération ?
<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
Copier après la connexion

Dans ce cas, "auto" déduit le type du type itérateur du vecteur. L'itérateur renvoie std::shared_ptr, qui est un type de référence. Cependant, puisque la déclaration de foo utilise une esperluette (&), elle se résout en la valeur déréférencée, qui est une copie du std::shared_ptr pour chaque itération de boucle.

Conclusion :

La règle de la déduction de type "auto" est simple : elle suit la déclaration de la variable elle-même. Pour résoudre en une référence, utilisez une esperluette dans la déclaration (auto &ref = ...). Sinon, "auto" déduira un type valeur.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!