कैसे l-मानों को std :: make_pair को पास किया जा सकता है

Aug 16 2020

इसमें std::make_pair केवल एक कार्यान्वयन C ++ 14 आगे है

टेम्पलेट <class T1, class T2> constexpr std :: pair <V1, V2> make_pair (T1 && t, T2 && u);

दोनों मानकों आर-मूल्य संदर्भ हैं और के अनुसार इस

R- मान संदर्भों को l-मानों के साथ आरंभ नहीं किया जा सकता है।

    int i = 1;
    char ch = 'a';
    std::unordered_map<int, char> mp;
    mp.insert(make_pair<int,char>(i, ch));

इसलिए जब मैं उपरोक्त कोड में make_pair का उपयोग करने की कोशिश करता हूं तो यह सही ढंग से एक त्रुटि फेंकता है error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'

हालाँकि यह उपरोक्त कोड के लिए पूरी तरह से काम करता है अगर मैं टेम्पलेट तर्क को छोड़ देता हूं और इसे कॉल करता हूं

mp.insert(make_pair(i, ch));

मैं उलझन में हूँ कि यह कैसे काम करता है iऔर chदोनों L-मान हैं। क्या टेम्पलेट तर्क संकल्प L-मानों को R-मानों में परिवर्तित करता है या यह कैसे काम करता है?

जवाब

3 songyuanyao Aug 16 2020 at 08:06

के मापदंडों को make_pairघोषणा-संदर्भ के रूप में घोषित नहीं किया जाता है, लेकिन अग्रेषण संदर्भ ।

अग्रेषण संदर्भ एक विशेष प्रकार के संदर्भ हैं जो एक फ़ंक्शन तर्क के मान श्रेणी को संरक्षित करते हैं, जिससे यह संभव है कि इसे आगे :: st आगे के माध्यम से आगे बढ़ाया जा सके। अग्रेषण संदर्भ या तो हैं:

  1. एक फ़ंक्शन टेम्पलेट के फ़ंक्शन पैरामीटर को उसी फ़ंक्शन टेम्पलेट के cv-unqualified प्रकार टेम्पलेट पैरामीटर के संदर्भ में घोषित किया जाता है:

टेम्पररी डिडक्शन कटौती की मदद से रेफ़रीइंग फॉरवर्ड रेफरी और रेवेल्यूज़ दोनों के साथ काम करता है । जब एक लेवल्यू पास किया जाता है, तो टेम्प्लेट पैरामीटर लैवल्यू-रेफरेंस के रूप में घटाया जाएगा, रेफरेंस के ढहने के बाद, फंक्शन पैरामीटर लैवल्यू-रेफरेंस भी होता है। जब एक रव्यू पास किया जा रहा है, तो टेम्पलेट पैरामीटर को गैर-संदर्भ के रूप में घटाया जाएगा, फ़ंक्शन पैरामीटर rvalue-reference है।

दूसरी ओर, यदि आप टेम्पलेट तर्क को स्पष्ट रूप से निर्दिष्ट करते हैं make_pair<int,char>(...), तो फ़ंक्शन पैरामीटर तदनुसार रूवल-रेफरेंस बन जाता है।

1 JaMiT Aug 16 2020 at 11:01

Songyuanyao द्वारा जवाब पहले से ही क्या चल रहा है के सबसे बताते हैं। मैं, हालांकि, यह स्पष्ट टेम्पलेट तर्कों के साथ इस काम को बनाने के लिए योगदान करना पसंद करूंगा। आप वहां सबसे ज्यादा थे, लेकिन आखिरी कदम नहीं उठाया।

मैं उलझन में हूँ कि यह कैसे काम करता है iऔर chदोनों L-मान हैं।

बिल्कुल सही। आप ऐसे एल-वैल्यू चाहते हैं, जो कुछ आप टेम्प्लेट तर्कों में निर्दिष्ट कर सकते हैं:

std::make_pair<int &, char &>(i, ch)

या ऐसा रूप जो अधिक मामलों में काम करता है:

std::make_pair<const int &, const char &>(i, ch)

थोड़ा अतिरिक्त लेखन, लेकिन अगर किसी कारणवश तर्क में कटौती विफल हो जाती है।