autoużywa tego samego mechanizmu dedukcji typu co szablony, z jedynym wyjątkiem, o którym wiem, że jest to lista inicjująca nawiasy klamrowe, które są wywnioskowane przez autoas std::initializer_list, ale nie są wywnioskowane w kontekście szablonu.
auto x = expression;
działa najpierw usuwając wszystkie kwalifikatory odwołania i cv z typu wyrażenia po prawej stronie, a następnie dopasowując typ. Na przykład, jeśli masz const int& f(){...}to auto x = f();dedukuje xjako int, a nie const int& .
Druga forma,
auto& x = expression
nie usuwa kwalifikatorów cv, więc korzystając z powyższego przykładu, auto& x = f()wnioskuje xjako const int&. Pozostałe kombinacje po prostu dodają kwalifikatory cv.
Jeśli chcesz, aby typ był zawsze wywnioskowany za pomocą kwalifikatorów cv-ref, użyj niesławnego decltype(auto)w C ++ 14, który używa decltypereguł odliczania typów.
Więc w skrócie, jeśli chcesz kopiować, użyj auto, jeśli chcesz odniesienia, użyj auto&. Używaj constzawsze, gdy chcesz mieć więcej const.
EDYTUJ
Istnieje dodatkowy przypadek użycia,
auto&& x = expression;
który wykorzystuje reguły zwijania referencji, takie same jak w przypadku przekazywania odwołań w kodzie szablonu. Jeśli expressionjest lwartością, to xjest odwołaniem do lwartości z kwalifikatorami cv expression. Jeśli expressionjest wartością r, to xjest odniesieniem do wartości r.
autodziała (z wyjątkiem osobliwego przypadkuinitializer_lists, które są niededukowane w kontekście szablonu), a następnieautowpisz deduction.