autoटाइप डिडक्शन के समान तंत्र को टेम्प्लेट के रूप में उपयोग करता है, एकमात्र अपवाद जो मुझे ब्रेस-इन-लिस्ट के होने के बारे में पता है, जो कि के autoरूप में द्वारा घटाए गए हैं std::initializer_list, लेकिन एक टेम्प्लेट के संदर्भ में गैर- कटौती किए गए हैं ।
auto x = expression;
राइट हैंड साइड एक्सप्रेशन के प्रकार से पहले सभी संदर्भ और cv क्वालिफायर को अलग करके, फिर टाइप से मिलान करके काम करता है। उदाहरण के लिए, यदि आपके पास const int& f(){...}तब के रूप में auto x = f();कटौती xहै int, और नहीं const int& ।
दूसरा रूप,
auto& x = expression
cv- क्वालीफायर को स्ट्रिप नहीं करता है , इसलिए, ऊपर दिए गए उदाहरण का उपयोग करके, auto& x = f()घटाता xहै const int&। अन्य संयोजन सिर्फ cv क्वालीफायर जोड़ते हैं।
यदि आप चाहते हैं कि आपका प्रकार हमेशा cv-ref क्वालिफायर के साथ घटाया जाए, तो decltype(auto)C ++ 14 में कुख्यात का उपयोग करें , जो कि decltypeप्रकार कटौती नियमों का उपयोग करता है।
इसलिए, संक्षेप में, यदि आप प्रतियां चाहते हैं auto, तो उपयोग करें , यदि आप संदर्भ चाहते हैं , तो उपयोग करें auto&। constजब भी आप अतिरिक्तता चाहते हैं, का उपयोग करें const।
EDIT
एक अतिरिक्त उपयोग मामला है,
auto&& x = expression;
जो संदर्भ-ढहते हुए नियमों का उपयोग करता है, उसी तरह जैसे कि टेम्पलेट कोड में संदर्भ अग्रेषित करने के मामले में। यदि expressionएक लैवल्यू है, तो xcv-क्वालिफायर के साथ एक लैवल्यू संदर्भ है expression। यदि expressionएक रव्वा है, तो xएक रवायु संदर्भ है।
autoकाम करता है (initializer_listएस के अजीबोगरीब मामले को छोड़कर) एक टेम्पलेट संदर्भ में गैर-autoकटौती ), फिर कटौती टाइप करें।