Co vím, tak auto
je navrženo a zamýšleno stejně, jako var
v C#, tj. pouze syntaktický cukr, aby se předešlo zápisům typu
MyClass* inst = new MyClass();
Oproti tomu
auto inst = new MyClass();
je kratší, jednodušší a každý pochopí, jakého typu je proměnná inst
. Zvlášť význam to pak dostává u konstrukcí typu
std::vector<int>::const_iterator itr = vect.cbegin();
Ano, jde to použít špatně a nečitelně, ale to jde skoro s čímkoliv.
Jak jsem zmínil, je to pouze syntaktická záležitost a výsledný zkompilovaný kód je stejný, proměnnou nejde deklarovat jako auto
bez toho, aby byl jasný její typ. Obdobně pak také nejde měnit její typ za chodu, stejně jako to nejde u žádné jiné proměnné.
V uvedeném příkladu tak byla špatně už samotná deklarace auto a;
.
U funkce platí totéž, musí být jasné, jaký typ tam má být a všechny returny musí vracet stejný typ (nebo možná kompatibilní typy v případě polymorfických tříd, nevím přesně, přímo standard jsem nečetl).