"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > टेम्पलेट तर्क कटौती को अक्षम करने के लिए std::forward पहचान टेम्पलेट का उपयोग क्यों करता है?

टेम्पलेट तर्क कटौती को अक्षम करने के लिए std::forward पहचान टेम्पलेट का उपयोग क्यों करता है?

2024-11-09 को प्रकाशित
ब्राउज़ करें:454

Why does std::forward use the identity template to disable template argument deduction?

सही अग्रेषण सुनिश्चित करने के लिए std::forward के साथ टेम्पलेट तर्क कटौती को अक्षम करना

VS2010 में std::forward की परिभाषा पर विचार करें:

template inline
_Ty&& forward(typename identity<_Ty>::type& _Arg)
{   // forward _Arg, given explicitly specified type parameter
    return ((_Ty&&)_Arg);
}

पहचान टेम्पलेट का उद्देश्य टेम्पलेट तर्क कटौती को अक्षम करना है। इस परिदृश्य में यह महत्वपूर्ण क्यों है?

टेम्पलेट तर्क कटौती से गलत प्रकार की कटौती होगी। यदि प्रकार X के किसी ऑब्जेक्ट का प्रतिद्वंद्विता संदर्भ पैरामीटर प्रकार T& के साथ टेम्पलेट फ़ंक्शन को पास किया जाता है, तो टेम्पलेट तर्क कटौती T को X के रूप में अनुमानित करेगी, जिसके परिणामस्वरूप पैरामीटर प्रकार X& होगा। हालाँकि, सही अग्रेषण के लिए, पैरामीटर एक अंतराल है क्योंकि इसका एक नाम है। इसलिए, std::forward में टेम्पलेट तर्क कटौती का उपयोग करने से घटाया गया पैरामीटर प्रकार एक लैवल्यू संदर्भ या कॉन्स्ट लैवल्यू संदर्भ बन जाएगा।

template
T&& forward_with_deduction(T&& obj)
{
    return static_cast

निम्नलिखित उदाहरण पर विचार करें:

void test(int&){}
void test(const int&){}
void test(int&&){}

template
void perfect_forwarder(T&& obj)
{
    test(forward_with_deduction(obj));
}

int main()
{
    int x;
    const int& y(x);
    int&& z = std::move(x);

    test(forward_with_deduction(7));    //  7 is an int&&, correctly calls test(int&&)
    test(forward_with_deduction(z));    //  z is treated as an int&, calls test(int&)

    //  All the below call test(int&) or test(const int&) because in perfect_forwarder 'obj' is treated as
    //  an int& or const int& (because it is named) so T in forward_with_deduction is deduced as int& 
    //  or const int&. The T&& in static_cast<T&&>(obj) then collapses to int& or const int& - which is not what 
    //  we want in the bottom two cases.
    perfect_forwarder(x);           
    perfect_forwarder(y);           
    perfect_forwarder(std::move(x));
    perfect_forwarder(std::move(y));
}

इस उदाहरण में, परफेक्ट फॉरवर्डिंग विफल हो जाती है क्योंकि परफेक्ट_फॉरवर्डर में पैरामीटर को उसके नाम के कारण लैवल्यू या कॉन्स्ट लैवल्यू संदर्भ के रूप में माना जाता है। इससे फॉरवर्ड_विथ_डिडक्शन में गलत प्रकार की कटौती होती है, जिसके परिणामस्वरूप अवांछित स्टैटिक_कास्ट सिमेंटिक्स होता है। अंतराल मानों के साथ-साथ प्रति मानों का सही सही अग्रेषण।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3