auto
verwendet den gleichen Mechanismus der Typableitung wie Vorlagen. Die einzige mir bekannte Ausnahme sind Klammer-Init-Listen, die von auto
as abgeleitet std::initializer_list
, aber in einem Vorlagenkontext nicht abgeleitet werden.
auto x = expression;
funktioniert, indem zuerst alle Referenz- und Lebenslaufqualifizierer vom Typ des Ausdrucks auf der rechten Seite entfernt und dann mit dem Typ abgeglichen werden. Zum Beispiel, wenn Sie const int& f(){...}
dann auto x = f();
folgert x
wie int
, und nicht const int&
.
Die andere Form,
auto& x = expression
nicht abzustreifen die cv-Qualifizierer, also vor dem Beispiel verwendet wird , auto& x = f()
folgert x
wie const int&
. Die anderen Kombinationen fügen nur Lebenslaufqualifizierer hinzu.
Wenn Sie möchten, dass Ihr Typ immer mit cv-ref-Qualifizierern abgeleitet wird, verwenden Sie das berüchtigte decltype(auto)
in C ++ 14, das die decltype
Typabzugsregeln verwendet.
Kurz gesagt, wenn Sie Kopien möchten, verwenden Sie auto
, wenn Sie Referenzen möchten, verwenden Sie auto&
. Verwenden const
Sie, wann immer Sie zusätzliche const
-ness wünschen .
BEARBEITEN
Es gibt einen zusätzlichen Anwendungsfall,
auto&& x = expression;
Dabei werden die Regeln zum Reduzieren von Referenzen verwendet, wie im Fall der Weiterleitung von Referenzen im Vorlagencode. Wenn expression
es sich um einen Wert handelt, x
handelt es sich um eine Wertreferenz mit den Lebenslaufqualifizierern von expression
. Wenn expression
es sich um einen rWert handelt, x
handelt es sich um eine rWert-Referenz.
auto
(mit Ausnahme des besonderen Falls voninitializer_list
s) nicht in einem Vorlagenkontext abgeleitet), geben Sie dannauto
Abzug ein.