अन्य उत्तर कमियों का उल्लेख कर रहे हैं जैसे "आप वास्तव में नहीं जानते कि एक चर का प्रकार क्या है।" मैं कहूंगा कि यह कोड में नामकरण सम्मेलन से काफी हद तक संबंधित है। यदि आपके इंटरफेस स्पष्ट रूप से नामित हैं, तो आपको यह ध्यान रखने की आवश्यकता नहीं है कि सटीक प्रकार क्या है। यकीन है, auto result = callSomeFunction(a, b);
आपको बहुत कुछ नहीं बताता है। लेकिन auto valid = isValid(xmlFile, schema);
आपको यह बताने के लिए पर्याप्त है valid
कि इसका सही प्रकार क्या है, इसकी परवाह किए बिना उपयोग करें । सब के बाद, बस के साथ if (callSomeFunction(a, b))
, आप या तो प्रकार नहीं जानते होंगे। किसी भी अन्य उपसमुच्चय अस्थायी वस्तुओं के साथ भी ऐसा ही है। इसलिए मैं इसे असली कमी नहीं मानता auto
।
मैं कहूंगा कि इसका प्राथमिक दोष यह है कि कभी-कभी, सटीक रिटर्न प्रकार वह नहीं होता है जिसके साथ आप काम करना चाहते हैं। वास्तव में, कभी-कभी वास्तविक रिटर्न प्रकार "तार्किक" रिटर्न प्रकार से कार्यान्वयन / अनुकूलन विवरण के रूप में भिन्न होता है। अभिव्यक्ति टेम्पलेट एक प्रमुख उदाहरण है। मान लें कि हमारे पास यह है:
SomeType operator* (const Matrix &lhs, const Vector &rhs);
तार्किक रूप से, हम उम्मीद करेंगे SomeType
होने के लिए Vector
, और हम निश्चित रूप से हमारे कोड में इस तरह के रूप में यह इलाज के लिए चाहते हैं। हालांकि, यह संभव है कि अनुकूलन उद्देश्यों के लिए, बीजगणित पुस्तकालय हम अभिव्यक्ति अभिव्यक्ति टेम्पलेट्स का उपयोग कर रहे हैं, और वास्तविक वापसी प्रकार यह है:
MultExpression<Matrix, Vector> operator* (const Matrix &lhs, const Vector &rhs);
अब, समस्या यह है कि MultExpression<Matrix, Vector>
सभी संभावना में एक const Matrix&
और const Vector&
आंतरिक रूप से स्टोर करेगा ; यह उम्मीद करता है कि यह Vector
अपनी पूर्ण अभिव्यक्ति के अंत से पहले परिवर्तित हो जाएगा । यदि हमारे पास यह कोड है, तो सब कुछ ठीक है:
extern Matrix a, b, c;
extern Vector v;
void compute()
{
Vector res = a * (b * (c * v));
// do something with res
}
हालांकि, अगर हमने यहां इस्तेमाल किया था, तो हम auto
परेशानी में पड़ सकते हैं:
void compute()
{
auto res = a * (b * (c * v));
// Oops! Now `res` is referring to temporaries (such as (c * v)) which no longer exist
}