auto
uż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 auto
as 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 x
jako 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 x
jako 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 decltype
reguł odliczania typów.
Więc w skrócie, jeśli chcesz kopiować, użyj auto
, jeśli chcesz odniesienia, użyj auto&
. Używaj const
zawsze, 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 expression
jest lwartością, to x
jest odwołaniem do lwartości z kwalifikatorami cv expression
. Jeśli expression
jest wartością r, to x
jest odniesieniem do wartości r.
auto
działa (z wyjątkiem osobliwego przypadkuinitializer_list
s, które są niededukowane w kontekście szablonu), a następnieauto
wpisz deduction.