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

autodeclaratorinitializer;

[](autoparam1, autoparam2) {};

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 automö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, volatileZeiger (), 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) typeidverwendet 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 autozusammen 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 autowurde.

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 intdeklariert. 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 intund die Variable fp auf einen Zeiger auf eine Funktion, die den Typ intzurü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