Otras respuestas mencionan inconvenientes como "realmente no sabes cuál es el tipo de variable". Yo diría que esto está relacionado en gran medida con la convención de nomenclatura descuidada en el código. Si sus interfaces están claramente nombradas, no debería tener que preocuparse por el tipo exacto. Claro, auto result = callSomeFunction(a, b);
no te dice mucho. Pero auto valid = isValid(xmlFile, schema);
le dice lo suficiente para usar valid
sin tener que preocuparse de cuál es su tipo exacto. Después de todo, con solo if (callSomeFunction(a, b))
, tampoco sabrías el tipo. Lo mismo con cualquier otro objeto temporal de subexpresión. Así que no considero que esto sea un verdadero inconveniente auto
.
Diría que su principal inconveniente es que a veces, el tipo de retorno exacto no es con el que desea trabajar. En efecto, a veces el tipo de retorno real difiere del tipo de retorno "lógico" como un detalle de implementación / optimización. Las plantillas de expresión son un excelente ejemplo. Digamos que tenemos esto:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
Lógicamente, esperaríamos SomeType
serlo Vector
, y definitivamente queremos tratarlo como tal en nuestro código. Sin embargo, es posible que para fines de optimización, la biblioteca de álgebra que estamos utilizando implemente plantillas de expresión, y el tipo de retorno real es este:
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
Ahora, el problema es que MultExpression<Matrix, Vector>
voluntad en toda tienda de probabilidad de que un const Matrix&
e const Vector&
internos; espera que se convierta a a Vector
antes del final de su expresión completa. Si tenemos este código, todo está bien:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
Sin embargo, si hubiéramos usado auto
aquí, podríamos tener problemas:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}