autoverwendet den gleichen Mechanismus der Typableitung wie Vorlagen. Die einzige mir bekannte Ausnahme sind Klammer-Init-Listen, die von autoas 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 xwie 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 xwie 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 decltypeTypabzugsregeln verwendet.
Kurz gesagt, wenn Sie Kopien möchten, verwenden Sie auto, wenn Sie Referenzen möchten, verwenden Sie auto&. Verwenden constSie, 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 expressiones sich um einen Wert handelt, xhandelt es sich um eine Wertreferenz mit den Lebenslaufqualifizierern von expression. Wenn expressiones sich um einen rWert handelt, xhandelt es sich um eine rWert-Referenz.
auto(mit Ausnahme des besonderen Falls voninitializer_lists) nicht in einem Vorlagenkontext abgeleitet), geben Sie dannautoAbzug ein.