std::move
के कार्यान्वयन मूल रूप से इस तरह दिखता है:std :: move आगे का संदर्भ क्यों लेता है?
template<typename T>
typename std::remove_reference<T>::type&&
move(T&& t)
{
return static_cast<typename std::remove_reference<T>::type&&>(t);
}
ध्यान दें कि std::move
के पैरामीटर एक सार्वभौमिक संदर्भ है (यह भी एक अग्रेषण संदर्भ के रूप में जाना है, लेकिन हम यहाँ अग्रेषण नहीं हैं)।
std::string a, b, c;
// ...
foo(std::move(a)); // fine, a is an lvalue
foo(std::move(b + c)); // nonsense, b + c is already an rvalue
लेकिन चूंकि std::move
के पूरे मुद्दे एक rvalue को कास्ट करने के लिए है, इसलिए हम भी std::move
rvalues करने की अनुमति है: यह तुम दोनों lvalues और rvalues std::move
कर सकते हैं, है? std::move
केवल लालच स्वीकार करेगा अगर यह अधिक समझ में नहीं आता है?
template<typename T>
T&&
move(T& t)
{
return static_cast<T&&>(t);
}
तब बकवास अभिव्यक्ति std::move(b + c)
संकलन-समय त्रुटि उत्पन्न करेगी।
std::move
के उपरोक्त कार्यान्वयन को शुरुआती लोगों के लिए समझना बहुत आसान होगा, क्योंकि कोड ठीक वही करता है जो ऐसा लगता है: यह एक लालसा लेता है और एक रैल्यू देता है। आपको सार्वभौमिक संदर्भ, संदर्भ ढहने और मेटा कार्यों को समझने की आवश्यकता नहीं है।
तो std::move
क्यों था lvalues और rvalues दोनों लेने के लिए बनाया गया था?
मेरा त्वरित अनुमान यह होगा कि जब आप अपने आस-पास की चीजों को स्थानांतरित करने के लिए कोड लिखते हैं तो यह लगातार नहीं रहना चाहती कि आपके चर याताएं हैं या नहीं, आप बस इसे करना चाहते हैं। – sim642
क्योंकि यह बिना किसी शर्त के रावल्यू के लिए दोनों lvalue और rvalue डालने के लिए डिज़ाइन किया गया है। –
@ 6502 एप्लिकेशन डेवलपर की तुलना में लाइब्रेरी डेवलपर के लिए यह प्रश्न या विवरण अधिक उपयोगी है। एप्लिकेशन डेवलपर बस खुशी से std :: move() को कॉल कर सकता है; और काम के साथ मिलते हैं। बेशक यह समझना चाहिए कि स्थानीय चर को स्थानांतरित करने से राज्य अमान्य हो जाएगा। अन्यथा यहां सिर तोड़ने के लिए कुछ नहीं। – Jagannath