Auto-Schlüsselwort (Typ-Ableitung)
Leitet den Typ einer deklarierten Variablen aus dem Initialisierungsausdruck ab.
auto declarator initializer;
Hinweise
Das auto-Schlüsselwort wird der Compiler, den Initialisierungsausdruck einer deklarierten Variablen verwenden, um den Typ ableiten kann.
Hinweis |
---|
Vor Visual C++ 2010 war das auto-Schlüsselwort der Bezeichner für die automatische Speicherklasse.Diese Verwendung ist jetzt ein Fehler.Die /Zc:auto-Compileroption, die standardmäßig verwendet wird, weist den Compiler an, die neue auto Bedeutung des - Schlüsselworts zu verwenden. |
Es wird empfohlen, das auto-Schlüsselwort für die meisten verwenden, Situation-essei dann, wenn Sie nicht möchten, Konvertierung-weil es diese Vorteile bietet:
Stabilität:, wenn der CHANGES-dieser Ausdruckstyp umfasst, wann ein Funktionsrückgabetyp CHANGES-es nur funktioniert.
Leistung: wird sichergestellt, dass keine Konvertierung ausgeführt wird.
Benutzerfreundlichkeit: müssen Sie sich nicht um Typnamenrechtschreibung Schwierigkeiten und Typos beschäftigen.
Effizienz: Codierung kann effizienter sein.
Konvertierungsfälle, in denen Sie nicht auto verwendet werden:
Wenn Sie einen bestimmten Typ soll und nichts anderes ausführt.
Ausdrucksvorlagenhilfe Typ – z. B. (valarray+valarray) und Initialisierer, Liste-obgleich selten würden Sie auswählen, um auto x = { 1 }; zu schreiben und tatsächlich zu erwarten, int abzurufen.
Um das auto-Schlüsselwort zu verwenden, verwenden Sie es anstelle eines Typs um eine Variable zu deklarieren, und geben Sie einen Initialisierungsausdruck an.Außerdem können Sie das - Schlüsselwort auto ändern, indem Sie Bezeichner und Deklaratoren wie const, volatile, Zeiger (),* Verweis (&) und rvalu-Verweis (&&) verwenden.Der Compiler wertet den Initialisierungsausdruck aus und verwendet dann diese Informationen, um den Typ der Variable abzuleiten.
Der Initialisierungsausdruck kann eine Zuweisung (Gleichheitszeichensyntax), eine direkte Initialisierung (Funktionsformatsyntax) oder ein Operator neu Ausdruck sein.Oder der Initialisierungsausdruck kann der Für-BereichDeklaration-Parameter in einer Bereichsbasiert für Anweisung (C++)-Anweisung sein.Weitere Informationen finden Sie unter Initialisierer und Codebeispiele weiter unten in diesem Dokument.
Das auto-Schlüsselwort ist ein Platzhalter für einen Typ, aber es ist nicht selbst ein Typ.Daher kann das auto-Schlüsselwort nicht in Typumwandlungen und Operatoren wie sizeof und typeid verwendet werden.
Nützlichkeit
Das auto-Schlüsselwort ist eine einfache Möglichkeit, eine Variable zu deklarieren, die über einen komplizierten Typ verfügt.Beispielsweise können Sie auto verwenden, um eine Variable zu deklarieren, in der der Initialisierungsausdruck Vorlagen, Zeiger auf Funktionen oder Zeiger auf Member einschließt.
Sie können auto auch verwenden, um eine Variable zu einem Lambda-Ausdruck zu deklarieren und zu initialisieren.Sie können den Typ der Variablen nicht deklarieren sicher, da der Typ eines Lambda-Ausdrucks nur dem Compiler bekannt.Weitere Informationen finden Sie unter Beispiele für Lambda-Ausdrücke.
Sie können auto, zusammen mit dem decltype-Typspezifizierer verwenden, um zu helfen, Vorlagenbibliotheken zu schreiben.Verwenden Sie auto und decltype, um eine Vorlagenfunktion zu deklarieren, deren Rückgabetyp von den Typen der Vorlagenargumente abhängt.Oder verwenden Sie auto und decltype, um eine Vorlagenfunktion zu deklarieren, die einen Aufruf einer anderen Funktion umschließt und anschließend zurückgibt, was der Rückgabetyp dieser anderen Funktion ist.Weitere Informationen finden Sie unter decltype-Typspezifizierer.
Beschränkungen und Fehlermeldungen
Die folgende Tabelle zeigt die Einschränkungen bei der Nutzung des Schlüsselworts auto und die entsprechende Diagnosefehlermeldung, welche der Compiler ausgibt.
Fehlernummer. |
Beschreibung |
---|---|
Das Schlüsselwort auto kann nicht mit einem anderen Typspezifizierer kombiniert werden. |
|
Ein Symbol, das mit dem auto-Schlüsselwort deklariert wird, muss einen Initialisierer haben. |
|
Sie haben fälschlicherweise das auto-Schlüsselwort verwendet, um einen Typ zu deklarieren.Zum Beispiel deklarierten Sie einen Methodenrückgabetyp oder ein Array. |
|
Ein Parameter oder ein Vorlagenargument können nicht mit dem auto-Schlüsselwort deklariert werden. |
|
Ein Symbol, das mit dem auto-Schlüsselwort in einem Ausdruck new deklariert wird, muss einen Initialisierer haben.Weitere Informationen finden Sie unter operator new (<new>). |
|
Eine Methode oder ein Vorlagenparameter können nicht mit dem auto-Schlüsselwort deklariert werden. |
|
EIn Symbol kann nicht vor der Initialisierung verwendet werden.In der Praxis bedeutet dies, dass eine Variable nicht verwendet werden kann, um sich selbst zu initialisieren. |
|
Sie können nicht in einen Typ umwandeln, der mit dem auto-Schlüsselwort deklariert wird. |
|
Alle Symbole in einer Deklaratorliste, die mit dem auto-Schlüsselwort deklariert werden, müssen zum gleichen Typs aufgelöst werden.Weitere Informationen finden Sie unter Deklarationen. |
|
Die sizeof- und typeid-Operatoren können nicht auf ein Symbol angewendet werden, das mit dem auto-Schlüsselwort deklariert wird. |
Beispiele
Diese Codefragmente veranschaulichen einige Möglichkeiten, in denen das auto-Schlüsselwort verwendet werden kann.
Die folgenden Deklarationen sind gleichwertig.In der ersten Anweisung ist die j-Variable vom Typ int deklariert.In der zweiten Anweisung wird die Variable k abgeleitet, um dem int-Typ zu entsprechen, 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 entsprechen sich, aber die zweite Deklaration ist einfacher als die erste.Einer der zwingendsten Gründe, das auto-Schlüsselwort zu verwenden, ist Einfachheit.
map<int,list<string>>::iterator i = m.begin();
auto i = m.begin();
Im folgenden Codefragment deklariert den Variablentyp iter und elem, wenn die for und Bereichs-for-Schleifen beginnen.
// 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
{ /* ... */ }
}
Das folgende Code-Fragment verwendet den Operator new und die Zeiger-Deklarierung, um Zeiger zu deklarieren.
double x = 12.34;
auto *y = new auto(x), **z = new auto(&x);
Im folgenden Codefragment deklariert mehrere Symbole in der Deklarationsanweisung.Beachten Sie, dass alle Symbole in jedem Anweisungsbeschluß auf denselben eingeben.
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 Variable x als ganze Zahl zu deklarieren, die den Wert 200 hat:
int v1 = 100, v2 = 200;
auto x = v1 > v2 ? v1 : v2;
Das folgende Code-Fragment initialisiert die Variable x zum Typ int, die Variable y zu einem Verweis auf Typ constint und die Variable fp zu einem 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
Referenz
/Zc:auto (Variablentyp ableiten)