auto
(C++)
Leitet den Typ einer deklarierten Variable vom entsprechenden Initialisierungsausdruck ab.
Hinweis
Der C++-Standard definiert ein Original und eine überarbeitete Bedeutung für diese Schlüsselwort (keyword). Vor Visual Studio 2010 deklariert die auto
Schlüsselwort (keyword) eine Variable in der automatischen Speicherklasse, d. h. eine Variable mit lokaler Lebensdauer. Ab Visual Studio 2010 deklariert die auto
Schlüsselwort (keyword) eine Variable, deren Typ vom Initialisierungsausdruck in der Deklaration abgeleitet ist. Die /Zc:auto[-]
Compileroption steuert die Bedeutung des auto
Schlüsselwort (keyword).
Syntax
auto
declaratorinitializer;
[](auto
param1, auto
param2) {};
Hinweise
Der auto
Schlüsselwort (keyword) leitet den Compiler an, den Initialisierungsausdruck einer deklarierten Variablen oder eines Lambda-Ausdrucksparameters zu verwenden, um den Typ zu deducieren.
Es wird empfohlen, die Schlüsselwort (keyword) für die auto
meisten Situationen zu verwenden, es sei denn, Sie möchten eine Konvertierung, da sie folgende Vorteile bietet:
Robustität: Wenn der Typ des Ausdrucks geändert wird – einschließlich der Änderung eines Funktionsrücklauftyps – funktioniert dies nur.
Leistung: Sie sind garantiert, dass keine Konvertierung vorhanden ist.
Nutzbarkeit: Sie müssen sich keine Gedanken über Schreibfehler und Tippfehler machen.
Effizienz: Ihre Codierung kann effizienter sein.
Konvertierungsfälle, in denen Sie möglicherweise nicht verwenden auto
möchten:
Sie möchten einen bestimmten Typ und nichts anderes tun.
In Hilfstypen für Ausdrucksvorlagen ,
(valarray+valarray)
z. B. .
Verwenden Sie die auto
Schlüsselwort (keyword) anstelle eines Typs, um eine Variable zu deklarieren, und geben Sie einen Initialisierungsausdruck an. Darüber hinaus können Sie die auto
Schlüsselwort (keyword) mithilfe von Bezeichnern und Deklaratoren wie const
, volatile
Zeiger (), Verweis (*
&
) und rvalue reference (&&
) ändern. Der Compiler wertet den Initialisierungsausdruck aus und verwendet dann diese Informationen, um den Typ der Variable herzuleiten.
Der auto
Initialisierungsausdruck kann mehrere Formen annehmen:
- Universelle Initialisierungssyntax, z
auto a { 42 };
. B. . - Zuordnungssyntax, z
auto b = 0;
. B. . - Universelle Zuordnungssyntax, die die beiden vorherigen Formulare kombiniert, z
auto c = { 3.14159 };
. B. . - Direkte Initialisierung oder Syntax im Konstruktorstil, z
auto d( 1.41421f );
. B. .
Weitere Informationen finden Sie unter Initialisierer und codebeispiele weiter unten in diesem Dokument.
Wenn auto
der Schleifenparameter in einer bereichsbasierten for
Anweisung deklariert wird, wird eine andere Initialisierungssyntax verwendet, z for (auto& i : iterable) do_action(i);
. B. . Weitere Informationen finden Sie unter Range-based for
Statement (C++).
Die auto
Schlüsselwort (keyword) ist ein Platzhalter für einen Typ, aber es ist nicht selbst ein Typ. Daher kann die auto
Schlüsselwort (keyword) nicht in Umwandlungen oder Operatoren wie sizeof
und (für C++/CLI) typeid
verwendet werden.
Nützlichkeit
Die auto
Schlüsselwort (keyword) ist eine einfache Möglichkeit, eine Variable mit einem komplizierten Typ zu deklarieren. Sie können auto
beispielsweise eine Variable deklarieren, in der der Initialisierungsausdruck Vorlagen, Zeiger auf Funktionen oder Zeiger auf Member umfasst.
Sie können auch auto
eine Variable für einen Lambda-Ausdruck deklarieren und initialisieren. Sie können den Typ der Variable nicht selbst deklarieren, da der Typ eines Lambdaausdrucks nur dem Compiler bekannt ist. Weitere Informationen finden Sie unter Beispiele für Lambda-Ausdrücke.
Nachstehende Rückgabetypen
Sie können auto
zusammen mit dem decltype
Typbezeichner Vorlagenbibliotheken schreiben. Verwenden und decltype
deklarieren Sie auto
eine Funktionsvorlage, deren Rückgabetyp von den Typen ihrer Vorlagenargumente abhängt. Sie können auch eine Funktionsvorlage verwenden auto
und decltype
deklarieren, die einen Aufruf einer anderen Funktion umschließt, und gibt dann den Rückgabetyp dieser anderen Funktion zurück. Weitere Informationen finden Sie unter decltype
.
Verweise und CV-Qualifizierer
Verwenden von auto
Tropfenverweise, const
Qualifizierern und volatile
Qualifizierern. Betrachten Sie das folgende Beispiel:
// cl.exe /analyze /EHsc /W4
#include <iostream>
using namespace std;
int main( )
{
int count = 10;
int& countRef = count;
auto myAuto = countRef;
countRef = 11;
cout << count << " ";
myAuto = 12;
cout << count << endl;
}
Im vorherigen Beispiel ist myAuto ein int
, kein int
Verweis, sodass die Ausgabe nicht 11 12
der Fall wäre11 11
, wenn der Verweisqualifizierer nicht gelöscht auto
wurde.
Typabzug mit geschweiften Initialisierern (C++14)
Das folgende Codebeispiel zeigt, wie Sie eine Variable mit geschweiften auto
Klammern initialisieren. Beachten Sie den Unterschied zwischen B und C und zwischen A und E.
#include <initializer_list>
int main()
{
// std::initializer_list<int>
auto A = { 1, 2 };
// std::initializer_list<int>
auto B = { 3 };
// int
auto C{ 4 };
// C3535: cannot deduce type for 'auto' from initializer list'
auto D = { 5, 6.7 };
// C3518 in a direct-list-initialization context the type for 'auto'
// can only be deduced from a single initializer expression
auto E{ 8, 9 };
return 0;
}
Einschränkungen und Fehlermeldungen
In der folgenden Tabelle sind die Einschränkungen für die Verwendung der auto
Schlüsselwort (keyword) und die entsprechende Diagnosefehlermeldung aufgeführt, die der Compiler ausgibt.
Fehlernummer | Beschreibung |
---|---|
C3530 | Der auto Schlüsselwort (keyword) kann nicht mit einem anderen Typbezeichner kombiniert werden. |
C3531 | Ein Symbol, das mit dem auto Schlüsselwort (keyword) deklariert wird, muss über einen Initialisierer verfügen. |
C3532 | Sie haben den auto Schlüsselwort (keyword) fälschlicherweise verwendet, um einen Typ zu deklarieren. Sie haben zum Beispiel einen Methodenrückgabetyp oder ein Array deklariert. |
C3533, C3539 | Ein Parameter- oder Vorlagenargument kann nicht mit dem auto Schlüsselwort (keyword) deklariert werden. |
C3535 | Eine Methode oder ein Vorlagenparameter kann nicht mit dem auto Schlüsselwort (keyword) deklariert werden. |
C3536 | Ein Symbol kann nicht verwendet werden, bevor es initialisiert wird. In der Praxis bedeutet dies, dass eine Variable nicht verwendet werden kann, um sich selbst zu initialisieren. |
C3537 | Sie können nicht in einen Typ umwandeln, der mit dem auto Schlüsselwort (keyword) deklariert wird. |
C3538 | Alle Symbole in einer Deklaratorliste, die mit dem auto Schlüsselwort (keyword) deklariert wird, müssen in denselben Typ aufgelöst werden. Weitere Informationen finden Sie unter Deklarationen und Definitionen. |
C3540, C3541 | Die Operatoren "sizeof" und "typeid" können nicht auf ein Symbol angewendet werden, das mit dem auto Schlüsselwort (keyword) deklariert wird. |
Beispiele
Diese Codefragmente veranschaulichen einige der Möglichkeiten, wie die auto
Schlüsselwort (keyword) verwendet werden können.
Die folgenden Deklarationen sind gleichwertig. In der ersten Anweisung wird die Variable j
als Typ int
deklariert. In der zweiten Anweisung wird die Variable k
als Typ int
abgeleitet, da der Initialisierungsausdruck (0) eine ganze Zahl ist.
int j = 0; // Variable j is explicitly type int.
auto k = 0; // Variable k is implicitly type int because 0 is an integer.
Die folgenden Deklarationen sind gleichwertig, die zweite Deklaration ist jedoch einfacher als die erste. Einer der überzeugendsten Gründe für die Verwendung der auto
Schlüsselwort (keyword) ist die Einfachheit.
map<int,list<string>>::iterator i = m.begin();
auto i = m.begin();
Im folgenden Codefragment wird der Typ der Variablen iter
deklariert, und elem
wenn die Und der for
Bereich for
gestartet wird.
// cl /EHsc /nologo /W4
#include <deque>
using namespace std;
int main()
{
deque<double> dqDoubleData(10, 0.1);
for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
{ /* ... */ }
// prefer range-for loops with the following information in mind
// (this applies to any range-for with auto, not just deque)
for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
{ /* ... */ }
for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
{ /* ... */ }
for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
{ /* ... */ }
}
Im folgenden Codefragment werden die new
Operator- und Zeigerdeklaration zum Deklarieren von Zeigern verwendet.
double x = 12.34;
auto *y = new auto(x), **z = new auto(&x);
Im folgenden Codefragment werden mehrere Symbole in jeder Deklarationsanweisung deklariert. Beachten Sie, dass alle Symbole in jeder Anweisung in den gleichen Typ aufgelöst werden.
auto x = 1, *y = &x, **z = &y; // Resolves to int.
auto a(2.01), *b (&a); // Resolves to double.
auto c = 'a', *d(&c); // Resolves to char.
auto m = 1, &n = m; // Resolves to int.
Dieses Codefragment verwendet den bedingten Operator (?:
), um die x
-Variable als ganze Zahl mit einem Wert von 200 zu deklarieren:
int v1 = 100, v2 = 200;
auto x = v1 > v2 ? v1 : v2;
Das folgende Codefragment initialisiert die Variable x
für den Typ int
, die Variable y
für einen Verweis auf den Typ const int
und die Variable fp
auf einen Zeiger auf eine Funktion, die den Typ int
zurückgibt.
int f(int x) { return x; }
int main()
{
auto x = f(0);
const auto& y = f(1);
int (*p)(int x);
p = f;
auto fp = p;
//...
}
Siehe auch
Schlüsselwörter
/Zc:auto
(Variablentyp deduce)
sizeof
-Operator
typeid
operator new
Deklarationen und Definitionen
Beispiele für Lambda-Ausdrücke
Initialisierer
decltype
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für