Jawaban lain menyebutkan kelemahan seperti "Anda tidak benar-benar tahu apa jenis variabelnya." Saya akan mengatakan bahwa ini sebagian besar terkait dengan konvensi penamaan ceroboh dalam kode. Jika antarmuka Anda diberi nama yang jelas, Anda tidak perlu peduli dengan tipe yang tepat. Tentu, auto result = callSomeFunction(a, b);
tidak banyak bercerita. Tetapi auto valid = isValid(xmlFile, schema);
memberitahu Anda cukup untuk digunakan valid
tanpa harus peduli apa jenis persisnya. Lagi pula, hanya dengan if (callSomeFunction(a, b))
, Anda tidak akan tahu jenisnya juga. Sama dengan objek sementara subekspresi lainnya. Jadi saya tidak menganggap ini sebagai kelemahan nyata auto
.
Saya akan mengatakan kelemahan utamanya adalah bahwa kadang-kadang, tipe pengembalian yang tepat bukanlah yang ingin Anda kerjakan. Akibatnya, kadang-kadang jenis pengembalian aktual berbeda dari jenis pengembalian "logis" sebagai detail implementasi / optimisasi. Template ekspresi adalah contoh utama. Katakanlah kita punya ini:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
Secara logis, kita berharap SomeType
demikian Vector
, dan kita pasti ingin memperlakukannya seperti itu dalam kode kita. Namun, ada kemungkinan bahwa untuk tujuan optimasi, perpustakaan aljabar yang kami gunakan mengimplementasikan templat ekspresi, dan tipe pengembalian sebenarnya adalah ini:
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
Sekarang, masalahnya adalah bahwa MultExpression<Matrix, Vector>
kemungkinan besar akan menyimpan const Matrix&
dan secara const Vector&
internal; ia mengharapkan bahwa itu akan dikonversi ke Vector
sebelum akhir dari ekspresi penuhnya. Jika kita memiliki kode ini, semuanya baik-baik saja:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
Namun, jika kami digunakan di auto
sini, kami bisa mendapat masalah:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}