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 validsenza 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 SomeTypedi esserlo Vectore 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 Vectorprima 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 autoqui, 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
}