सही अग्रेषण सुनिश्चित करने के लिए 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