Diğer cevaplar, "bir değişkenin türünün ne olduğunu gerçekten bilmiyorsunuz" gibi dezavantajlardan bahsediyor. Bunun büyük ölçüde koddaki özensiz adlandırma kuralıyla ilgili olduğunu söyleyebilirim. Arayüzleriniz açıkça adlandırılmışsa, tam türün ne olduğunu önemsemeniz gerekmez . Tabii, auto result = callSomeFunction(a, b);
sana fazla bir şey söylemiyor. Ancak , tam türünün ne olduğunu umursamadan auto valid = isValid(xmlFile, schema);
kullanmanız için yeterli olduğunu söyler valid
. Sonuçta, sadece if (callSomeFunction(a, b))
, türü de bilmezdiniz. Diğer alt ifade geçici nesneleri için de aynı şey geçerlidir. Bu yüzden bunun gerçek bir dezavantajı olduğunu düşünmüyorum auto
.
Birincil dezavantajı, bazen, tam dönüş türünün çalışmak istediğiniz şey olmadığıdır . Aslında, gerçek dönüş türü bazen bir uygulama / optimizasyon ayrıntısı olarak "mantıksal" dönüş türünden farklıdır. İfade şablonları buna en iyi örnektir. Diyelim ki buna sahibiz:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
Mantıken, biz beklenebilir SomeType
olması Vector
ve biz kesinlikle bizim kodunda gibi bunu tedavi etmek istiyorum. Ancak, optimizasyon amacıyla kullandığımız cebir kütüphanesinin ifade şablonlarını uygulaması mümkündür ve gerçek dönüş türü şöyledir:
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
Şimdi, sorun büyük MultExpression<Matrix, Vector>
olasılıkla a const Matrix&
ve const Vector&
dahili olarak depolanacak ; Vector
tam ifadesinin bitiminden önce a'ya dönüşmesini bekler . Bu kod varsa, her şey yolunda:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
Ancak, auto
burada kullansaydık , başımız belaya girebilirdi:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}