स्वतः और decltype अलग-अलग उद्देश्यों की पूर्ति करते हैं ताकि वे एक-से-एक मैप न करें। ऑटो सी ++ 11 में एक कीवर्ड है और बाद में इसका उपयोग स्वचालित प्रकार की कटौती के लिए किया जाता है। decltype प्रकार निर्दिष्टकर्ता निर्दिष्ट अभिव्यक्ति के प्रकार उत्पन्न करता है। ऑटो के विपरीत जो वैरिएबल को असाइन किए जा रहे मानों के आधार पर प्रकारों को घटाता है, decltype उस प्रकार को पास की गई अभिव्यक्ति से घटाता है। decltype द्वारा लौटाया गया मान सीधे दूसरे चर को परिभाषित करने के लिए उपयोग किया जा सकता है।
ऑटो टेम्पलेट पैरामीटर कटौती के नियमों का पालन करता है। आप इन नियमों के बारे में https://en.cppreference.com/w/cpp/language/template_argument_deduction
पर अधिक पढ़ सकते हैं।जबकि decltype के नियम हैं, इसे मानक में परिभाषित का पालन करना चाहिए। यहाँ इन नियमों के साथ मानक का एक अंश दिया गया है:
sizeof ऑपरेटर के समान, decltype के ऑपरेंड का मूल्यांकन नहीं किया जाता है। अनौपचारिक रूप से, decltype(e) द्वारा लौटाया गया प्रकार निम्नानुसार घटाया जाता है -
- यदि अभिव्यक्ति ई स्थानीय या नाम स्थान क्षेत्र में एक चर को संदर्भित करता है, एक स्थिर सदस्य चर या एक फ़ंक्शन पैरामीटर, तो परिणाम उस चर या पैरामीटर का घोषित प्रकार होता है
- यदि ई एक फ़ंक्शन कॉल या एक अतिभारित ऑपरेटर आमंत्रण है, तो decltype(e) उस फ़ंक्शन के घोषित रिटर्न प्रकार को दर्शाता है
- अन्यथा, यदि e एक अंतराल है, decltype(e) T&है, जहां T, e का प्रकार है; अगर ई एक प्रतिद्वंद्विता है, तो परिणाम टी है
इन शब्दार्थों को सामान्य पुस्तकालय लेखकों की जरूरतों को पूरा करने के लिए डिज़ाइन किया गया था, जबकि एक ही समय में नौसिखिए प्रोग्रामर के लिए सहज ज्ञान युक्त होने के कारण डिक्लेटाइप का रिटर्न प्रकार हमेशा ऑब्जेक्ट या फ़ंक्शन के प्रकार से मेल खाता है जैसा कि घोषित किया गया है सोर्स कोड। अधिक औपचारिक रूप से, नियम 1 गैर-संक्षिप्त आईडी-अभिव्यक्तियों और वर्ग सदस्य पहुंच अभिव्यक्तियों पर लागू होता है। फ़ंक्शन कॉल के लिए, घटाया गया प्रकार सांख्यिकीय रूप से चुने गए फ़ंक्शन का रिटर्न प्रकार है, जैसा कि अधिभार समाधान के नियमों द्वारा निर्धारित किया जाता है।
उदाहरण
ऑटो और डिक्लेटाइप का उपयोग करने का उदाहरण,
#include<iostream> #include<vector> using namespace std; int main() { // Using auto for type deduction vector<int> arr(10); for(auto it = arr.begin(); it != arr.end(); it ++) { cin >> *it; } // Using decltype for type deduction vector<int> arr(10); for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) { cin >> *it; } return 0; }
ध्यान दें कि decltype द्वारा दर्शाया गया प्रकार auto द्वारा निकाले गए प्रकार से भिन्न हो सकता है। आप इन सूक्ष्म अंतरों के बारे में C++ में टाइप डिडक्शन के इस 12-पृष्ठ स्पष्टीकरण में अधिक पढ़ सकते हैं - https://thbecker.net/articles/auto_and_decltype/section_01.html