Gibt für Variablen an, dass der Typ der deklarierten Variablen automatisch von ihrem Initialisierer abgeleitet wird. Gibt für Funktionen an, dass der Rückgabetyp ein nachfolgender Rückgabetyp ist oder aus seinen Rückgabeanweisungen abgeleitet wird (seit C ++ 14).
Syntax
auto variable initializer (1) (since C++11)
auto function -> return type (2) (since C++11)
auto function (3) (since C++14)
decltype(auto) variable initializer (4) (since C++14)
decltype(auto) function (5) (since C++14)
auto :: (6) (concepts TS)
cv(optional) auto ref(optional) parameter (7) (since C++14)
Erläuterung
1) Beim Deklarieren von Variablen im Blockbereich, im Namespace-Bereich, in Initialisierungsanweisungen von for-Schleifen usw. kann das Schlüsselwort auto als Typbezeichner verwendet werden. Sobald der Typ des Initialisierers bestimmt wurde, bestimmt der Compiler den Typ, der das Schlüsselwort auto ersetzt, anhand der Regeln für den Abzug von Vorlagenargumenten aus einem Funktionsaufruf (Einzelheiten finden Sie unter Abzug von Vorlagenargumenten # Andere Kontexte). Das Schlüsselwort auto kann von Modifikatoren wie const oder & begleitet werden, die am Typabzug teilnehmen. Zum Beispiel ist const auto& i = expr;
der Typ von i genau der Typ des Arguments u in einer imaginären Vorlage, template<class U> void f(const U& u)
wenn der Funktionsaufruff(expr)
wurde zusammengestellt. Daher kann auto && entweder als l-Wert-Referenz oder als r-Wert-Referenz gemäß dem Initialisierer abgeleitet werden, der in einer bereichsbasierten for-Schleife verwendet wird. Wenn auto zum Deklarieren mehrerer Variablen verwendet wird, müssen die abgeleiteten Typen übereinstimmen. Zum Beispiel ist die Deklaration auto i = 0, d = 0.0;
schlecht geformt, während die Deklaration auto i = 0, *p = &i;
wohlgeformt ist und das Auto als int abgeleitet wird.
2) In einer Funktionsdeklaration, die die Syntax des nachfolgenden Rückgabetyps verwendet, führt das Schlüsselwort auto keine automatische Typerkennung durch. Es dient nur als Teil der Syntax.
3) In einer Funktionsdeklaration, die nicht die Syntax des nachfolgenden Rückgabetyps verwendet, gibt das Schlüsselwort auto an, dass der Rückgabetyp unter Verwendung der Regeln für die Ableitung von Vorlagenargumenten aus dem Operanden seiner Rückgabeanweisung abgeleitet wird.
4) Wenn der deklarierte Typ der Variablen decltype (auto) ist, wird das Schlüsselwort auto durch den Ausdruck (oder die Ausdrucksliste) des Initialisierers ersetzt und der tatsächliche Typ anhand der Regeln für decltype abgeleitet.
5) Wenn der Rückgabetyp der Funktion als decltype (auto) deklariert ist, wird das Schlüsselwort auto durch den Operanden der return-Anweisung ersetzt und der tatsächliche Rückgabetyp anhand der Regeln für decltype abgeleitet.
6) Ein verschachtelter Namensbezeichner der Form auto :: ist ein Platzhalter, der durch einen Klassen- oder Aufzählungstyp ersetzt wird, der den Regeln für den Abzug von Platzhaltern mit eingeschränktem Typ folgt.
7) Eine Parameterdeklaration in einem Lambda-Ausdruck. (seit C ++ 14) Eine Funktionsparameterdeklaration. (Konzepte TS)
Hinweise
Bis C ++ 11 hatte auto die Semantik eines Speicherdauerspezifizierers. Das Mischen von automatischen Variablen und Funktionen in einer Deklaration wie in auto f() -> int, i = 0;
ist nicht zulässig.
Für weitere Informationen: http://en.cppreference.com/w/cpp/language/auto