Auto और decltype अलग-अलग उद्देश्यों की पूर्ति करते हैं इसलिए वे एक-से-एक मैप नहीं करते। auto C++11 और बाद का एक कीवर्ड है जिसका उपयोग ऑटोमैटिक टाइप डिडक्शन के लिए किया जाता है। decltype टाइप स्पेसिफायर किसी निर्दिष्ट एक्सप्रेशन का प्रकार देता है। Auto के विपरीत जो वेरिएबल को असाइन किए जा रहे मानों के आधार पर प्रकारों का अनुमान लगाता है, decltype इसमें पास किए गए एक्सप्रेशन से प्रकार का अनुमान लगाता है। Decltype द्वारा लौटाया गया मान सीधे दूसरे वेरिएबल को परिभाषित करने के लिए उपयोग किया जा सकता है।
Auto टेम्प्लेट पैरामीटर डिडक्शन के नियमों का पालन करता है। आप इन नियमों के बारे में यहां अधिक पढ़ सकते हैं।
जबकि decltype के मानक में परिभाषित नियमों का पालन करना होता है। यहां इन नियमों के साथ मानक का एक अंश दिया गया है:
sizeof ऑपरेटर के समान, decltype का ऑपरेंड अनइवैल्यूएटेड होता है। अनौपचारिक रूप से, decltype(e) द्वारा लौटाया गया प्रकार निम्नानुसार निकाला जाता है –
- यदि एक्सप्रेशन e लोकल या नेमस्पेस स्कोप में किसी वेरिएबल, स्टैटिक मेंबर वेरिएबल या फंक्शन पैरामीटर को संदर्भित करता है, तो परिणाम उस वेरिएबल या पैरामीटर का घोषित प्रकार होता है
- यदि e एक फंक्शन कॉल या ओवरलोडेड ऑपरेटर इनवोकेशन है, तो decltype(e) उस फंक्शन के घोषित रिटर्न टाइप को दर्शाता है
- अन्यथा, यदि e एक lvalue है, तो decltype(e) T& है, जहां T e का प्रकार है; यदि e एक rvalue है, तो परिणाम T है
ये सेमेंटिक्स जेनेरिक लाइब्रेरी लेखकों की जरूरतों को पूरा करने के लिए डिज़ाइन किए गए थे, साथ ही नौसिखिया प्रोग्रामर्स के लिए सहज होने के लिए क्योंकि decltype का रिटर्न टाइप हमेशा ऑब्जेक्ट या फंक्शन के प्रकार से बिल्कुल मेल खाता है जैसा कि सोर्स कोड में घोषित किया गया है। अधिक औपचारिक रूप से, नियम 1 अनपैरेंथेसाइज़्ड id-एक्सप्रेशंस और क्लास मेंबर एक्सेस एक्सप्रेशंस पर लागू होता है। फंक्शन कॉल्स के लिए, डिडक्शन प्रकार स्टैटिकली चुने गए फंक्शन का रिटर्न टाइप होता है, जैसा कि ओवरलोड रिज़ॉल्यूशन के नियमों द्वारा निर्धारित किया जाता है।
उदाहरण
Auto और decltype का उपयोग करते हुए उदाहरण,
#include<iostream>
#include<vector>
using namespace std;
int main() {
// Auto का उपयोग टाइप डिडक्शन के लिए
vector<int> arr(10);
for(auto it = arr.begin(); it != arr.end(); it++) {
cin >> *it;
}
// Decltype का उपयोग टाइप डिडक्शन के लिए
vector<int> arr(10);
for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) {
cin >> *it;
}
return 0;
}
ध्यान दें कि decltype द्वारा दर्शाया गया प्रकार auto द्वारा डिडक्ट किए गए प्रकार से भिन्न हो सकता है। आप C++ में टाइप डिडक्शन की इस 12-पृष्ठ की व्याख्या में इन सूक्ष्म अंतरों के बारे में अधिक पढ़ सकते हैं – thbecker.net।