Heim  >  Artikel  >  Backend-Entwicklung  >  Wann leitet „auto“ in C 11 einen Wert oder eine Referenz ab?

Wann leitet „auto“ in C 11 einen Wert oder eine Referenz ab?

Linda Hamilton
Linda HamiltonOriginal
2024-11-03 15:35:02899Durchsuche

When does `auto` in C  11 deduce a value or a reference?

Die Feinheiten der „auto“-Semantik von C 11

In C 11 bietet das Schlüsselwort auto eine praktische Möglichkeit, den Typ einer Variablen basierend auf ihrem Initialisierer automatisch abzuleiten . Es sind jedoch bestimmte Punkte zu beachten, ob auto in einen Wert oder eine Referenz aufgelöst wird.

Die Regel verstehen

Die Regel ist einfach: Sie hängt davon ab, wie die Variable deklariert wird.

<code class="cpp">int i = 5;
auto a1 = i;    // value
auto &a2 = i;  // reference</code>

Im ersten Fall ist a1 ein Wert, da er nicht als Referenz deklariert wurde. Im zweiten Fall ist a2 eine Referenz, weil sie explizit als solche deklariert wurde.

Klärung der Unsicherheiten

Wenden wir diese Regel auf die von Ihnen angegebenen Beispiele an:

  • auto p = get_foo();: get_foo() gibt eine Referenz auf einen Smart Pointer zurück. Da p ohne Referenz deklariert wird, handelt es sich um eine Kopie, was zu einem Objekt vom Referenztyp führt.
  • auto sp = s_foo;: s_foo ist eine statische Referenz auf einen Smart Pointer. Wenn es sp zugewiesen wird, wird die Referenz kopiert, was zu einem Referenztypobjekt führt.
  • for (auto foo: c): foo ist eine Kopie jedes Iterators im Vektor weil es nicht als Referenz deklariert ist.

Beweis mit Template-Metaprogrammierung

Der folgende Code demonstriert dieses Verhalten mithilfe von Template-Metaprogrammierung:

<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&amp;>
{
    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>

Ausgabe:

value
reference
value
value
reference
value

Dies bestätigt, dass der Typ von Auto durch seine Deklaration und nicht durch den Typ seines Initialisierers bestimmt wird.

Das obige ist der detaillierte Inhalt vonWann leitet „auto“ in C 11 einen Wert oder eine Referenz ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn