Maison > développement back-end > C++ > 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 ?

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

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