दोनों std::forward
और std::move
कुछ नहीं बल्कि जातियां हैं।
X x;
std::move(x);
उपरोक्त x
प्रकार X के लवल्यू एक्सप्रेशन को टाइप X के रिवेल्यू एक्सप्रेशन (सटीक होने के लिए एक एक्सवल्यू) कास्ट करता है। move
भी एक स्वीकार कर सकते हैं:
std::move(make_X());
और इस मामले में यह एक पहचान समारोह है: टाइप X का एक अंतराल लेता है और प्रकार X का एक अंतराल लौटाता है।
साथ std::forward
आप कुछ हद तक गंतव्य का चयन कर सकते हैं:
X x;
std::forward<Y>(x);
x
टाइप X के लैवल्यू एक्सप्रेशन को टाइप Y की अभिव्यक्ति के लिए कास्ट करता है। Y क्या हो सकता है, इस पर अड़चनें हैं।
Y, X का एक सुलभ आधार हो सकता है, या X के आधार का संदर्भ Y हो सकता है। X, या X का संदर्भ हो सकता है। कोई cv-क्वालिफायर को दूर नहीं कर सकता है forward
, लेकिन कोई cv-qualifiers जोड़ सकता है। Y एक प्रकार नहीं हो सकता है जो एक्स से केवल एक परिवर्तनीय आधार रूपांतरण को छोड़कर केवल परिवर्तनीय है।
यदि Y एक लैवल्यू संदर्भ है, तो परिणाम एक लैवल्यू एक्सप्रेशन होगा। यदि Y एक लेवल्यू संदर्भ नहीं है, तो परिणाम एक रिवेल्यू (सटीक होने के लिए xvalue) होगा।
forward
यदि केवल एक lvalue संदर्भ नहीं है, तो एक तर्क तर्क ले सकता है। यही है, आप अंतराल के लिए एक अंतराल नहीं डाल सकते हैं। यह सुरक्षा कारणों से है क्योंकि ऐसा करने से आमतौर पर झूलने वाले संदर्भ बन जाते हैं। लेकिन प्रतिद्वंद्विता के लिए एक कास्टिंग डालना ठीक है और अनुमति है।
यदि आप Y को किसी ऐसी चीज़ के लिए निर्दिष्ट करने का प्रयास करते हैं जिसकी अनुमति नहीं है, तो त्रुटि संकलन समय पर पकड़ी जाएगी, समय नहीं चलाया जाएगा।