Heim > Backend-Entwicklung > C++ > Hauptteil

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

Linda Hamilton
Freigeben: 2024-11-02 21:52:30
Original
437 Leute haben es durchsucht

When Does

Die „auto“-Semantik von C 11 verstehen

In C 11 ermöglicht das Schlüsselwort „auto“ die automatische Typableitung. Die Bestimmung, ob es sich um einen Wert oder eine Referenz handelt, kann jedoch manchmal nicht eindeutig sein.

Typabzugsregeln:

Die Regel für den Typabzug in „auto“ ist unkompliziert : Es basiert darauf, wie das Objekt deklariert wird.

Zum Beispiel:

<code class="cpp">int i = 5;</code>
Nach dem Login kopieren

Wenn wir deklarieren:

<code class="cpp">auto a1 = i;    // value
auto &a2 = i;  // reference</code>
Nach dem Login kopieren

a1 wird als Werttyp abgezogen (int), während a2 als Referenztyp (int&) abgezogen wird.

Mehrdeutige Fälle:

Betrachten Sie die folgenden Beispiele:

<code class="cpp">const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?</code>
Nach dem Login kopieren

get_foo gibt eine Referenz zurück, aber p ist als „auto“ deklariert. In diesem Fall leitet auto ab, dass der Typ von p eine Referenz auf Foo ist.

<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
Nach dem Login kopieren

s_foo ist eine statische Instanz eines gemeinsamen Zeigers auf Foo. sp wird mit „auto“ deklariert, sodass es als gemeinsamer Zeiger auf Foo abgezogen wird.

<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
Nach dem Login kopieren

Hier iteriert „auto“ durch den Vektor und leitet daraus ab, dass es sich bei foo um einen gemeinsam genutzten Zeiger handelt zu Foo. Dies bedeutet, dass für jede Iteration ein neuer temporärer gemeinsam genutzter Zeiger erstellt wird.

Demonstration:

Der folgende Code demonstriert diese Konzepte:

<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>
Nach dem Login kopieren

Ausgabe:

value
reference
value
value
reference
value
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage