Ich verstehe also, dass die Verwendung von var
in C # sinnvoll ist, weil Sie anonyme Typen haben, die vom Compiler abgeleitet sind. C ++ scheint diese Funktion nicht zu haben (es sei denn, ich liege falsch). Warum also ein auto
Schlüsselwort?
(Es ist irgendwie cool, dass auto
im Gegensatz zu C # für Member / globale Variablen funktioniert, was cool ist, aber das scheint nicht genug zu sein, um seine Existenz zu rechtfertigen).
auto
hat eine Menge Nutzen, wenn es sowohl um generische Programmierung als auch darum geht, dem Programmierer ein wenig Tipparbeit zu ersparen.
Betrachten Sie dies zum Beispiel. Würdest du lieber tippen:
%Vor%oder:
%Vor%Ja, sie sind beide lang, aber wir wissen, dass der Rückgabetyp und das erneute Angeben etwas mühsam zu tippen ist. Dies gilt auch für Iteratoren:
%Vor%gegen:
%Vor%Seine Verwendung in der generischen Programmierung ist auch, um den Rückgabetyp einer Funktion herauszufinden oder wenn Sie einige generische Algorithmen machen, bei denen Sie den Typ nicht kennen.
Betrachten Sie zum Beispiel ein sehr einfaches Beispiel.
%Vor% Dies ermöglicht es dem Compiler, den Typ der Hinzufügeoperation herauszufinden, anstatt dass wir selbst versuchen, es herauszufinden. Beachten Sie, dass Sie in C ++ 14 den nachfolgenden Rückgabetyp weglassen können. Seine Verwendung in der generischen Programmierung hört auch dort nicht auf. Wenn wir mit jeder Art von Container als Wrapper-Funktion für Algorithmen arbeiten wollten, könnten wir auto
verwenden, um uns dabei zu helfen. Zum Beispiel:
In Zukunft (C ++ 14) kann auto auch verwendet werden, um polymorphe Lambdas zu erstellen, wie zum Beispiel:
%Vor%Das kann auch nützlich sein.
Es gibt eine Reihe von Verwendungen für auto
in C ++
Anonyme Funktionsobjekte, auch bekannt als Closures, alias Lambda-Instanzen. auto
ist die einzige Möglichkeit, sie zu speichern. Es können auch Typen generiert werden, die von diesen Typen abgeleitet sind, und Typen auf ihren Rückseiten ad infinitum.
C ++ kann recht komplexe Typen haben, z. B. den Typ eines nicht mutierenden Iterators in eine ungeordnete Map, die einen benutzerdefinierten Zuordner und eine Hash-Funktion verwendet. typedef
kann dies abschwächen, aber der Typ von m.begin()
mit einem bestimmten Namen ist nicht so aussagekräftig: foo_iterator it =
ist so aussagekräftig wie auto foo_iterator =
und% ce_de% one benötigt keine anderen Daten.
Bei der Rückgabetypableitung wird das auto
-Schlüsselwort verwendet, das benötigt wird, damit einige auto
-Funktionen ohne große Mengen an Eigenschaften funktionieren. Ein gängiges Thema ist das Eliminieren von Textbausteinen: Das robuste C ++ - System bedeutet, dass Typen viele Informationen enthalten können, und die Kodierung bei jeder Verwendung kann kontraproduktiv sein.
In einigen ducktype template
-Code ist die Arbeit, um den Typ einer Variablen abzuleiten, ungefähr die gleiche wie die Arbeit, um den Variablenwert zu codieren, und fast identisch in der Struktur, manchmal wörtlich: template
. decltype(long expression) x = long expression;
beseitigt diese Duplizierung.
Schließlich in C ++ 1y, geben Sie deduction lambdas ein und verwenden Sie auto
, um zu sagen, dass ein Argument abgeleitet ist. Eine Art Leichtgewicht auto
. Sprechen Sie dies zu non lambdas zu erweitern ist auch in Skunkworks.
Es gibt ein Beispiel aus dem wirklichen Leben, wo ich nicht konnte, nicht Auto
Ich habe versucht, in C ++ eine Anweisung vom Typ switch auszuführen, bei der der Rückgabetyp umsetzungsspezifisch ist und nicht einfach deklariert werden kann. Die Verwendung eines 'auto' ist wahrscheinlich der richtige Weg, um den Typ-Lookup für die Kartendeklaration aufzulösen.
%Vor%C ++ hat "anonyme" Typen - Typen, auf die Sie nicht namentlich verweisen können, weil der Name Ihnen nicht zur Verfügung steht. Dies war schon vor C ++ 11 und Lambdas der Fall. Betrachten Sie den folgenden Code:
%Vor% Auch wenn sie nicht in einem privaten Bereich deklariert sind, ist es für eine Bibliothek oft nützlich, einige Typen in ihrer API nicht anzugeben - insbesondere, wenn Expressionsvorlagen oder andere Template-Metaprogrammierungen verwendet werden, bei denen die Typennamen beliebig lang sein können verschachtelte Vorlagenargumente. Selbst der Standard selbst tut dies - zum Beispiel ist der Ergebnistyp von std::bind
nicht durch die Spezifikation definiert.
Es lohnt sich, den Artikel von Herb Sutter fast immer zu lesen Auto für einige großartige Beispiele, warum es sich lohnt, auto
über explizite Typen zu verwenden. Die Hauptvorteile sind die Verringerung der Tipparbeit und gibt zusätzliche Sicherheit, wenn sich die zugrunde liegenden Typen ändern. Eines meiner Lieblingsbeispiele ist jedoch, wie es die Duplizierung reduziert. Wenn Sie auf dem Stapel zuweisen, würden Sie verwenden:
Wenn Sie jedoch auf dem Heap erstellen möchten, müssen Sie:
%Vor% Sie mussten also die MyClass
duplizieren, aber die RHS erzwingt bereits, dass die Variable ein MyClass
-Zeiger ist, also können Sie stattdessen nur diese verwenden:
Wenn Sie es als unique_ptr
deklarieren möchten, benötigen Sie zuvor:
kann abgekürzt werden mit:
%Vor%In C ++ bietet auto keyword eine Möglichkeit zum Typabzugsmechanismus. Zum Beispiel
%Vor% Das Schlüsselwortauto weist den Compiler an, den Typ der Variablen i aus dem Ausdruck auf der rechten Seite des Zuweisungsoperators zu bestimmen.
Wenn also der Wert von Ausdrücken doppelt ist, dann ist die Variable i doppelt. Oder, wenn der Wert von Ausdrücken bool ist, dann wird die Variable i bool sein.