Heim > Backend-Entwicklung > C++ > Wie wird bei der Verwendung von „auto' in C 11 bestimmt, ob eine Variable eine Referenz oder ein Wert ist?

Wie wird bei der Verwendung von „auto' in C 11 bestimmt, ob eine Variable eine Referenz oder ein Wert ist?

Susan Sarandon
Freigeben: 2024-11-04 11:24:02
Original
1069 Leute haben es durchsucht

When using

C 11 „auto“-Typableitung: Referenz vs. Wert auflösen

In C 11 bietet das Schlüsselwort „auto“ eine praktische Möglichkeit um den Typ einer Variablen automatisch abzuleiten. Wenn Sie jedoch „auto“ verwenden, ist es wichtig, die Regeln zu verstehen, die bestimmen, ob es in einen Wert oder eine Referenz aufgelöst wird.

Typabzugsregeln für „auto“:

Die Grundregel ist, dass „auto“ die Deklaration der Variablen selbst interpretiert, nicht den Typ, den sie darstellt. Daher zeigt das folgende Beispiel deutlich, dass „auto“ in einen Wert aufgelöst wird:

<code class="cpp">auto i = v.begin(); // Copy, as begin() returns an iterator by value</code>
Nach dem Login kopieren

In komplexeren Szenarien kann der Unterschied jedoch weniger offensichtlich sein. Betrachten Sie die folgenden Beispiele:

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

In diesem Fall leitet „auto“ den Typ ab der Rückgabetyp der Funktion get_foo(), der ein Verweis auf einen std::shared_ptr ist. Da die Deklaration von p ein einzelnes kaufmännisches Und (&) verwendet, wird sie in eine Kopie und nicht in eine Referenz aufgelöst.

  • Fall 2: Statische Variable – Kopie oder Referenz ?
<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
Nach dem Login kopieren

Hier leitet „auto“ den Typ aus der Deklaration von s_foo ab, bei dem es sich um ein statisches std::shared_ptr handelt. Da die Deklaration von sp kein kaufmännisches Und enthält, wird sie wieder in eine Kopie aufgelöst.

  • Fall 3: Schleife über einen Container – Kopie für jede Iteration?
<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
Nach dem Login kopieren

In diesem Fall leitet „auto“ den Typ vom Iteratortyp des Vektors ab. Der Iterator gibt std::shared_ptr zurück, einen Referenztyp. Da die Deklaration von foo jedoch ein kaufmännisches Und (&) verwendet, wird sie in den dereferenzierten-Wert aufgelöst, der eine Kopie des std::shared_ptr-Werts ist. für jede Schleifeniteration.

Schlussfolgerung:

Die Regel für die Typableitung „auto“ ist unkompliziert: Sie folgt der Deklaration der Variablen selbst. Um eine Referenz aufzulösen, verwenden Sie ein kaufmännisches Und in der Deklaration (auto &ref = ...). Andernfalls leitet „auto“ einen Werttyp ab.

Das obige ist der detaillierte Inhalt vonWie wird bei der Verwendung von „auto' in C 11 bestimmt, ob eine Variable eine Referenz oder ein Wert ist?. 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