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
एक लैवल्यू है, तो x
cv-क्वालिफायर के साथ एक लैवल्यू संदर्भ है expression
। यदि expression
एक रव्वा है, तो x
एक रवायु संदर्भ है।
auto
काम करता है (initializer_list
एस के अजीबोगरीब मामले को छोड़कर) एक टेम्पलेट संदर्भ में गैर-auto
कटौती ), फिर कटौती टाइप करें।