std::forward
और std::move
दोनों कुछ भी नहीं हैं।
X x;
std::move(x);
ऊपर प्रकार एक्स (एक XValue सटीक होना करने के लिए) के एक rvalue अभिव्यक्ति के प्रकार एक्स के lvalue अभिव्यक्ति x
डाले। move
भी एक rvalue स्वीकार कर सकते हैं:
std::move(make_X());
और इस मामले में यह एक पहचान समारोह है: प्रकार एक्स के एक rvalue लेता है और प्रकार एक्स के एक rvalue रिटर्न
std::forward
साथ
आप के लिए गंतव्य का चयन कर सकते हैं कुछ हद:
X x;
std::forward<Y>(x);
प्रकार वाई की अभिव्यक्ति के लिए प्रकार एक्स के lvalue अभिव्यक्ति x
डाले Y क्या हो सकता है पर कमी कर रहे हैं।
वाई एक्स का एक सुलभ आधार हो सकता है, या एक्स के आधार के संदर्भ में वाई हो सकता है, या एक्स का संदर्भ हो सकता है। कोई forward
के साथ सीवी-क्वालीफायर को नहीं हटा सकता है, लेकिन कोई भी सीवी- क्वालिफायर। वाई एक प्रकार का नहीं हो सकता है जो एक्स से केवल परिवर्तनीय है, एक सुलभ आधार रूपांतरण के अलावा।
यदि वाई एक लवल्यू संदर्भ है, तो परिणाम एक अंतराल अभिव्यक्ति होगी। यदि वाई एक लवण संदर्भ नहीं है, तो परिणाम एक रैवल्यू (सटीक होना चाहिए) अभिव्यक्ति होगी।
forward
केवल एक रावल्यू तर्क ले सकता है यदि वाई एक लवल्यू संदर्भ नहीं है। यही है, आप lvalue के लिए एक rvalue नहीं डाल सकते हैं। यह सुरक्षा कारणों से है क्योंकि ऐसा करने से आम तौर पर खतरनाक संदर्भ होते हैं। लेकिन रैवल्यू के लिए एक रैल्यू कास्टिंग ठीक है और अनुमति है।
यदि आप किसी ऐसी चीज़ को निर्दिष्ट करने का प्रयास करते हैं जिसकी अनुमति नहीं है, तो त्रुटि समय पर संकलित समय पर पकड़ा जाएगा, समय नहीं चलाया जाएगा।
स्रोत
2012-03-12 17:52:06
इन दो संबंधित प्रश्नों को भी देखें: [क्या मुझे std :: move या std :: move ctors/असाइनमेंट ऑपरेटर में आगे बढ़ाना चाहिए?] (Http://stackoverflow.com/q/8860233/500104) और [कैसे करता है std :: आगे काम?] (http://stackoverflow.com/q/8526598/500104) (साथ ही डुप्लिकेट प्रश्न के रूप में)। – Xeo
"इसके बारे में आसानी से कैसे सोचें, और जब आप * चाल * को स्थानांतरित करना चाहते हैं, तो आप 'move' का उपयोग करते हैं, और 'अग्रेषित' जब आप सही अग्रेषण का उपयोग करना चाहते हैं। यह यहां रॉकेट विज्ञान नहीं है;) –
चाल() बिना शर्त कास्ट करें जहां आगे() पारित पैरामीटर के आधार पर कास्ट प्रदर्शन करते हैं। –