Heim >Backend-Entwicklung >C++ >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-02 21:52:30515Durchsuche

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>

Wenn wir deklarieren:

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

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>

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>

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>

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>

Ausgabe:

value
reference
value
value
reference
value

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