Altre risposte citano inconvenienti come "non sai davvero quale sia il tipo di una variabile". Direi che questo è in gran parte correlato alla convenzione di denominazione sciatta nel codice. Se le tue interfacce hanno un nome chiaro, non dovresti preoccuparti di quale sia il tipo esatto. Certo, auto result = callSomeFunction(a, b);
non ti dice molto. Ma auto valid = isValid(xmlFile, schema);
ti dice abbastanza da usare valid
senza preoccuparti del tipo esatto. Dopotutto, con just if (callSomeFunction(a, b))
, non sapresti nemmeno il tipo. Lo stesso con qualsiasi altro oggetto temporaneo di sottoespressione. Quindi non lo considero un vero inconveniente di auto
.
Direi che il suo principale svantaggio è che a volte il tipo esatto di restituzione non è quello con cui vuoi lavorare. In effetti, a volte il tipo restituito effettivo differisce dal tipo restituito "logico" come dettaglio di implementazione / ottimizzazione. I modelli di espressione sono un ottimo esempio. Diciamo che abbiamo questo:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
Logicamente, ci aspetteremmo SomeType
di esserlo Vector
e vorremmo sicuramente trattarlo come tale nel nostro codice. Tuttavia, è possibile che ai fini dell'ottimizzazione, la libreria di algebra che stiamo utilizzando implementa i modelli di espressione e il tipo di ritorno effettivo è questo:
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
Ora, il problema è che MultExpression<Matrix, Vector>
con ogni probabilità verrà archiviato un const Matrix&
e const Vector&
internamente; si aspetta che si convertirà in a Vector
prima della fine della sua espressione completa. Se abbiamo questo codice, va tutto bene:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
Tuttavia, se avessimo usato auto
qui, potremmo avere dei problemi:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}