Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में auto और decltype का संबंध क्या है?


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।

  1. - C++ में ++i और i++ में क्या अंतर है?

    ++ के सफ़िक्स और प्रीफिक्स संस्करणों के बीच एक बड़ा अंतर है। प्रीफिक्स संस्करण में (यानी, ++i), i का मान बढ़ाया जाता है, और एक्सप्रेशन का मान i का नया मान होता है। तो मूल रूप से यह पहले इन्क्रीमेंट करता है फिर एक्सप्रेशन को मान असाइन करता है। पोस्टफिक्स संस्करण में (यानी, i++), i का मान बढ़ाया जात

  1. - C++ में डॉट (.) ऑपरेटर और -> में क्या अंतर है?

    डॉट और एरो ऑपरेटर दोनों का उपयोग C++ में क्लास के मेंबर्स को एक्सेस करने के लिए किया जाता है। वे केवल अलग-अलग परिदृश्यों में उपयोग किए जाते हैं। C++ में, क्लास, स्ट्रक्चर, या यूनियन के रूप में घोषित प्रकारों को क्लास टाइप का माना जाता है। इसलिए निम्नलिखित उन सभी तीनों को संदर्भित करता है। a.b केवल

  1. - C++ में auto कीवर्ड क्या करता है?

    Auto एक कीवर्ड था जिसे C++ ने C से विरासत में प्राप्त किया था जो लगभग हमेशा से था, लेकिन शायद ही कभी उपयोग किया जाता था। यह सब C++11 में संदर्भ से टाइप डिडक्शन करने के लिए auto की शुरुआत के साथ बदल गया। C++ 11 से पहले, प्रत्येक डेटा टाइप को कंपाइल टाइम पर स्पष्ट रूप से घोषित करने की आवश्यकता होती थी