std::move() lvalues पर क्या करता है?
std::move() सुविधा के लिए C में एक शक्तिशाली उपकरण है उत्तम अग्रेषण. फिर भी इसका कार्यान्वयन पहली नज़र में कुछ लोगों की भौंहें चढ़ा सकता है। यह स्पष्ट करने के लिए कि std::move() इसे कैसे प्राप्त करता है, आइए इसके कार्यान्वयन की जटिलताओं पर गौर करें।
'मूव' फ़ंक्शन को समझना
हम शुरुआत करेंगे 'मूव' फ़ंक्शन टेम्पलेट का सरलीकृत संस्करण:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
केस 1: एक Rvalue पास करना
जब std::move() को एक rvalue के साथ कॉल किया जाता है (एक अस्थायी वस्तु या एक अभिव्यक्ति जो एक rvalue का मूल्यांकन करती है) , मूव टेम्प्लेट को इस प्रकार त्वरित किया जाता है:
// move with [T = Object]: remove_reference
ऑब्जेक्ट ए; // ए लवल्यू है ऑब्जेक्ट b = std::move(a);
Object&& move(Object&& arg) { return static_cast
// [T = ऑब्जेक्ट&] के साथ मूव करें
हटाएं_संदर्भ::प्रकार&& स्थानांतरित करें(ऑब्जेक्ट&&& arg)
{ return static_cast
पहली नज़र में, यह उल्टा लगता है क्योंकि हम एक अंतराल पार कर चुके हैं। हालाँकि, सी 11 रेफरेंस कोलैप्सिंग की अवधारणा का परिचय देता है, जो संदर्भ सिंटैक्स की व्याख्या को संशोधित करता है:
ऑब्जेक्ट & & = ऑब्जेक्ट &Object a; // a is lvalue Object b = std::move(a);ऑब्जेक्ट & & && = ऑब्जेक्ट &ऑब्जेक्ट & && & = ऑब्जेक्ट &
Object a; // a is lvalue Object b = std::move(a);ऑब्जेक्ट & && & && = ऑब्जेक्ट & &&
Object&& move(Object& && arg) { return static_cast
इसलिए, फ़ंक्शन का अंतिम रूप बन जाता है:Object&& move(Object& arg) { return static_cast
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3