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

Quand \'auto\' déduit-il une valeur ou une référence en C 11 ?

Linda Hamilton
Libérer: 2024-11-02 21:52:30
original
438 Les gens l'ont consulté

When Does

Comprendre la sémantique "auto" de C 11

En C 11, le mot-clé "auto" permet une déduction automatique de type. Cependant, déterminer s'il se résout en une valeur ou une référence peut parfois être ambigu.

Règles de déduction de type :

La règle de déduction de type dans "auto" est simple : il est basé sur la façon dont l'objet est déclaré.

Par exemple :

<code class="cpp">int i = 5;</code>
Copier après la connexion

Si nous déclarons :

<code class="cpp">auto a1 = i;    // value
auto &a2 = i;  // reference</code>
Copier après la connexion

a1 sera déduit comme type de valeur (int), tandis que a2 sera déduit comme type de référence (int&).

Cas ambigus :

Considérez les exemples suivants :

<code class="cpp">const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?</code>
Copier après la connexion

get_foo renvoie une référence, mais p est déclaré comme "auto". Dans ce cas, auto déduira le type de p comme étant une référence à Foo.

<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
Copier après la connexion

s_foo est une instance statique d'un pointeur partagé vers Foo. sp est déclaré en utilisant "auto", il sera donc déduit comme un pointeur partagé vers Foo.

<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

Ici, "auto" parcourra le vecteur, déduisant le type de foo comme étant un pointeur partagé à Foo. Cela signifie qu'un nouveau pointeur partagé temporaire est créé pour chaque itération.

Démonstration :

Le code suivant illustre ces concepts :

<code class="cpp">#include <typeinfo>
#include <iostream>

template< typename T >
struct A
{
    static void foo(){ std::cout << "value" << std::endl; }
};
template< typename T >
struct A< T&& >
{
    static void foo(){ std::cout << "reference" << std::endl; }
};

float& bar()
{
    static float t=5.5;
    return t;
}

int main()
{
    int i = 5;
    int &r = i;

    auto a1 = i;
    auto a2 = r;
    auto a3 = bar();

    A<decltype(i)>::foo();       // value
    A<decltype(r)>::foo();       // reference
    A<decltype(a1)>::foo();      // value
    A<decltype(a2)>::foo();      // value
    A<decltype(bar())>::foo();   // reference
    A<decltype(a3)>::foo();      // value
}</code>
Copier après la connexion

Sortie :

value
reference
value
value
reference
value
Copier après la connexion

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