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

C++ में ऑटो और डिक्लेटाइप के बीच क्या संबंध है?


स्वतः और 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


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

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

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

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

  1. C++ में ऑटो कीवर्ड क्या करता है?

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