2011-04-01 11 views
20

A Brief Introduction to Rvalue References में, forward को निम्नानुसार परिभाषित किया गया है:सी ++ 0x रावल्यू संदर्भ के लिए आगे परिभाषा में पहचान का उपयोग क्यों करें?

 template <typename T> 
    struct identity { typedef T type; }; 

    template <typename T> 
    T &&forward(typename identity<T>::type &&a) { return a; } 

identity कक्षा का क्या उद्देश्य है? क्यों नहीं:

 template <typename T> 
    T &&forward(T &&a) { return a; } 

उत्तर

18

identity के प्रयोजन के T गैर निगम्य बनाने के लिए किया गया था। यही है, forward पर कॉल करते समय क्लाइंट को स्पष्ट रूप से T की आपूर्ति करने के लिए मजबूर करना है। क्योंकि टेम्पलेट पैरामीटर स्विच जिसके साथ ग्राहक संकलक बताता है या तो एक lvalue रूप में या एक rvalue के रूप में तर्क अग्रेषित करने के लिए है

forward(a);  // compile-time error 
forward<A>(a); // ok 

कारण यह आवश्यक है। यदि आप गलती से इस जानकारी की आपूर्ति करना भूल जाते हैं तो अंतराल हमेशा अंतराल के रूप में वापस आते हैं और रावल हमेशा राजस्व के रूप में वापस आते हैं। जबकि पहले आप जो चाहते हैं उसकी तरह लग सकते हैं, यह वास्तव में नहीं है।

template <class T, class A1> 
std::shared_ptr<T> 
factory(A1&& a1) 
{ 
    return std::shared_ptr<T>(new T(std::forward<A1>(a1))); 
} 

ऊपर के उदाहरण a1 में हमेशा एक lvalue है। लेकिन "स्विच" A1 एक लवली संदर्भ हो सकता है या नहीं भी हो सकता है। यदि यह एक lvalue संदर्भ है, a1 एक lvalue के रूप में वापस आ जाता है, अन्यथा a1 एक रैल्यू के रूप में वापस आ जाता है। यदि कारखाने का लेखक आकस्मिक रूप से ए 1 की आपूर्ति करना भूल जाता है, तो identity का उपयोग उसे संकलित समय पर याद दिलाता है।

नोट: अंतिम ड्राफ्ट में identity की कमी है, लेकिन उसी उद्देश्य के लिए उसी स्थान पर remove_reference का उपयोग करता है।

+0

मुझे लगता है कि यह मेरे उत्तर से बेहतर समझाया गया है, इसलिए मैंने अपना हटा दिया है। मैं अभी भी सोच रहा हूं कि क्या एक अच्छा उदाहरण है जहां आप 'अग्रेषित' के लिए एक रावल्यू तर्क पास करते हैं। क्या कोई प्रयोगकाज है? शायद मानक पुस्तकालय में? –

+0

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2951.html में केस बी का उपयोग देखें। ध्यान दें कि यह पत्र आगे के कार्यान्वयन का प्रस्ताव करता है जो अंत में समस्याग्रस्त पाया गया था। हालांकि अंतिम फॉरवर्ड विनिर्देश इस पेपर में प्रस्तुत सभी उपयोग मामलों को पास करता है और सही ढंग से विफल रहता है। यहां पेपर http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3143.html है जो अंतिम उपयोग केस को इंगित करता है जो N2951 चूक गया। –

+0

एक बहुत अच्छी व्याख्या, धन्यवाद। – user2023370

संबंधित मुद्दे