2011-01-23 14 views
33

मैं सोच रहा था क्या एक rvalue संदर्भ सदस्यरैवल्यू संदर्भ सदस्यों का उपयोग?

class A { 
    // ... 
    // Is this one useful? 
    Foo &&f; 
}; 

है का उपयोग यह एक lvalue संदर्भ सदस्य की तुलना में किसी भी लाभ या कमियां है? इसका मुख्य उपयोग क्या है?

+0

@GMan मैं क्यों कि अभी 'कह टेम्पलेट struct ACW {टी एंड टी से बेहतर है पता नहीं है; एसीडब्ल्यू (टी एंड टी टी): टी (टी) {} टेम्पलेट ऑपरेटर यू() {वापसी static_cast (std :: आगे (टी)); }} '। सदस्य को एक रावल संदर्भ संदर्भित करके आप क्या हासिल करते हैं? बीटीडब्लू, मुझे लगता है कि एन 3225 का कहना है कि यदि आपके पास कोई रैल्यू संदर्भ सदस्य हैं तो डिफॉल्ट कॉपी कन्स्ट्रक्टर को हटा दिया गया है। तो आप अभी भी 'auto_cast_wrapper ' की प्रतिलिपि नहीं बना सकते हैं, लेकिन केवल इसे स्थानांतरित करें :) –

+0

कुछ भी नहीं, मेरा मतलब है कि मैंने इसे लॉल किया था। और एचएम, जानना अच्छा है। मुझे इसे बाद में ठीक करना होगा। – GManNickG

+0

@GMan ओह, अब मैं देखता हूँ! दिखाने के लिए धन्यवाद, मुझे लगता है कि यह उपयोग करने के लिए कुछ दिलचस्प उपकरण है। –

उत्तर

21

मैं rvalue संदर्भ डेटा के सदस्यों के लिए एक बड़ा उत्साहवर्धक उपयोग के मामले को देखा है, और यह C++ 0x प्रारूप में है:

template<class... Types> 
tuple<Types&&...> 
forward_as_tuple(Types&&... t) noexcept; 

प्रभाव: तर्कों को संदर्भ उपस्थित टपल निर्माणों टी में फ़ंक्शन में तर्क के रूप में अग्रेषित करने के लिए उपयुक्त है। क्योंकि परिणाम में अस्थायी चर के संदर्भ शामिल हैं, एक प्रोग्राम यह सुनिश्चित करेगा कि इस फ़ंक्शन का रिटर्न मान किसी भी तर्क से बाहर नहीं निकलता है। (उदाहरण के लिए, प्रोग्राम आमतौर पर नामित चर में परिणाम संग्रहीत नहीं करना चाहिए)।

रिटर्न: tuple<Types&&...>(std::forward<Types>(t)...)

टपल rvalue संदर्भ डेटा के सदस्यों जब rvalues ​​forward_as_tuple को तर्क के रूप में उपयोग किया जाता है, और नहीं तो lvalue संदर्भ डेटा सदस्य हैं है।

मुझे आगे बढ़ने के लिए आगे की मदद मिली है जब वे विविध तर्कों को पकड़ने की आवश्यकता होती है, उन्हें पूरी तरह से टुपल के रूप में पैक किया जाता है, और बाद में उन्हें एक फ़ैक्टर को अग्रेषित करने के बिंदु पर फिर से विस्तारित किया जाता है। जब tuple_cat का एक उन्नत संस्करण LWG 1385 में प्रस्तावित लागू करने मैं इस शैली में forward_as_tuple प्रयोग किया है:

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#1385

+0

क्या आप समझा सकते हैं कि इस मामले में रावल्यू आजीवन कैसे प्रबंधित किया जाता है ?क्या रावलू विनाश किसी भी तरह से "बाद के बिंदु" तक बढ़ाया जाता है जब रावल का उपयोग किया जाता है? –

+1

आपके उत्तर और स्पष्टीकरण के लिए धन्यवाद। प्रश्न आया कि आवश्यकता क्या है "क्योंकि परिणाम में अस्थायी चर के संदर्भ हो सकते हैं, एक कार्यक्रम यह सुनिश्चित करेगा कि इस फ़ंक्शन का वापसी मूल्य इसके किसी भी तर्क को पार नहीं कर पाएगा।" एक कार्यक्रम का तात्पर्य है। क्या इस तरह के एक स्निपेट ने व्यवहार को अपरिभाषित किया है? '{auto x = forward_as_tuple (0); } ', क्योंकि यह प्रभाव खंड में आवश्यकता-आवश्यकता का उल्लंघन करता है? ऐसी आवश्यकता क्यों है? क्या एक ट्यूपल जिसमें बालों के संदर्भ शामिल हैं, को नष्ट करने की अनुमति नहीं है? –

+1

forward_as_tuple के क्लाइंट को यह सुनिश्चित करना होगा कि परिणाम अनुक्रम बिंदु से पहले "खपत" हो। इसके उपयोग के पहले उदाहरण इस प्रकार पाए जाते हैं: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3059.pdf लेकिन इस दस्तावेज़ में फ़ंक्शन को_____________ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ N3059 में उपयोग किए गए संदर्भों का टुपल दिखाता है, उस क्रम में खपत (प्रयुक्त), और नष्ट किए गए किसी अन्य कार्य को पारित किया जाता है। –

12

Stephan T. Lavavej के अनुसार, रावल्यू संदर्भ डेटा सदस्यों का कोई उपयोग नहीं है।

जब मैंने रैल्यू संदर्भों को पकड़ लिया है तो प्रोग्रामर जो करते हैं, वह यह है कि वे थोड़ा पागल हो जाते हैं, क्योंकि वे बहुत शक्तिशाली होते हैं। वे कहने लगते हैं "ओह, मेरे पास रावल्यू संदर्भ डेटा सदस्य होगा, मेरे पास स्थानीय चर के संदर्भ में रावल्यू संदर्भ होगा, मेरे पास रावल्यू संदर्भ रिटर्न वैल्यू होंगे!" और फिर वे इस तरह के कोड लिखते हैं: [...]

+0

ग्रेट सेरी, यह सब देखने के लिए जा रहा है, लेकिन मैं इसके लिए तत्पर हूं :) –

+17

हम रैवल्यू संदर्भों का सही तरीके से उपयोग करने के तरीके के बारे में 10 साल पहले होंगे। –

+0

मुझे लगता है कि प्रोग्रामर रैवल्यू संदर्भों के बारे में उलझन में हैं और सोचते हैं कि वे वस्तु के जीवनकाल (इस प्रकार रावल्यू संदर्भ रिटर्न वैल्यू) को जादुई रूप से बढ़ाएंगे, जबकि वास्तव में वीडियो में बताए गए जीवनकाल के साथ इसका कोई लेना-देना नहीं है। –

2

बस जोर से सोचकर, लेकिन क्या इसका उपयोग मज़दूरों में नहीं होगा? वास्तविक फ़ंक्शन कॉल से पहले, कन्स्ट्रक्टर को अक्सर "करीइंग" के लिए उपयोग किया जाता है, कुछ पैरामीटर को पहले से बाध्य करता है।

इसलिए इस संदर्भ में, क्लास सदस्य आगामी फ़ंक्शन कॉल के लिए केवल एक स्टेजिंग ग्राउंड (या मैन्युअल रूप से कार्यान्वित बंद) है, और मुझे कोई कारण नहीं दिखता कि एक रावल्यू संदर्भ वहां सार्थक क्यों नहीं होगा।

लेकिन "नियमित" गैर-फ़ैक्टर कक्षाओं में, मुझे बहुत अधिक बिंदु दिखाई नहीं देता है।

+0

डाउनवोट क्यों? – jalf

+0

इस मामले में एक रैल्यू संदर्भ 'कॉन्स्ट एंड' से बेहतर है (या यदि आपको इसे संशोधित करने की आवश्यकता है तो केवल एक सामान्य संदर्भ)? –

+0

इसी कारण से आप अन्यथा किसी फ़ंक्शन को रेवल्यू रेफरी पास करना चाहते हैं: इसे * से * स्थानांतरित करने में सक्षम होने के लिए। – jalf

2
class A { 
    // ... 
    // Is this one useful? 
    Foo &&f; 
}; 

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

लेकिन आप पैरामीटर प्रकार वाले डेटा सदस्यों को परिभाषित करना चाहते हैं। std :: tuple उदाहरण के लिए, lvalue और rvalue संदर्भ डेटा सदस्यों का समर्थन करने जा रहा है। इस तरह यह आपको एक अभिव्यक्ति की मूल्य श्रेणी को संहिताबद्ध करने की अनुमति देता है जो "देरी पूर्ण अग्रेषण" के लिए आसान हो सकता है। मानक प्रारूप भी रूप

template<class Args...> 
tuple<Args&&...> pack_arguments(Args&&...args); 

के एक समारोह टेम्पलेट शामिल लेकिन मैं ईमानदारी से इसकी उपयोगिता के बारे में यकीन नहीं है।

+0

यह पोस्ट forward_as_tuple या pack_arguments का एक संभावित उपयोग बताता है: http://cpptruths.blogspot.com/2012/06/perfect-forwarding-of-parameter-groups.html – Sumant

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