23

इस समारोह के लिए एक तर्क एक rvalue संदर्भ के लिए बाध्य होगा:क्या सार्वभौमिक संदर्भ और अग्रेषण संदर्भों के बीच कोई अंतर है?

template <typename T> 
void f(T && t); 

मैं अक्सर है:

void f(int && i); 

बहरहाल, यह कार्य करने के लिए एक तर्क या तो एक rvalue या एक lvalue संदर्भ के लिए बाध्य होगा इसे एक सार्वभौमिक संदर्भ के रूप में जाना जाता है।
मैंने यह भी सुना है कि इसे अग्रेषण संदर्भ कहा जाता है।
क्या उनका मतलब एक ही बात है?
क्या यह केवल एक अग्रेषण संदर्भ है यदि फ़ंक्शन बॉडी std::forward पर कॉल करता है?

+1

कुछ पृष्ठभूमि सामग्री के लिए https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers देखें। –

+1

@SamVarshavchik क्या आपने वास्तव में या तो प्रश्न या ब्लॉग पढ़ा था? – Barry

उत्तर

25

क्या उनका वही मतलब है?

Universal reference एक शब्द स्कॉट Meyers एक सीवी-अयोग्य टेम्पलेट पैरामीटर, जो तब या तो एक मूल्य या एक lvalue संदर्भ के रूप में निष्कर्ष निकाला जा सकता है के लिए एक rvalue संदर्भ लेने की अवधारणा को वर्णन करने के लिए गढ़ा गया था।

उस समय सी ++ मानक के लिए विशेष शब्द नहीं था, जो सी ++ 11 में एक निरीक्षण था और इसे सिखाना मुश्किल बनाता है। इस निरीक्षण N4164, जो [temp.deduct] को निम्नलिखित परिभाषा जोड़ा द्वारा उपचार किया गया था:

एक अग्रेषण संदर्भ एक सीवी-अयोग्य टेम्पलेट पैरामीटर के लिए एक rvalue संदर्भ है। यदि P एक अग्रेषण संदर्भ है और तर्क एक अंतराल है, तो टाइप के लिए ए के स्थान पर "ए के लिए lvalue संदर्भ" प्रकार का उपयोग किया जाता है।

इसलिए, दोनों का मतलब एक ही बात है, और वर्तमान सी ++ मानक शब्द अग्रेषण संदर्भ है। पेपर स्वयं ही बताता है कि क्यों "अग्रेषण संदर्भ" "सार्वभौमिक संदर्भ" से बेहतर शब्द है।

क्या यह केवल फ़ॉरवर्डिंग संदर्भ है यदि फ़ंक्शन बॉडी std::forward पर कॉल करता है?

नहीं, आप अग्रेषण संदर्भ के साथ क्या करते हैं, नाम के लिए अप्रासंगिक है। अवधारणा अग्रेषण संदर्भ बस कैसे प्रकार T में निष्कर्ष निकाला है को संदर्भित करता:

template <class T> void foo(T&&); // <== 

यह बाद अग्रेषित किए जाने की जरूरत नहीं है।

+1

अच्छा जवाब! क्या आपके पास कोई (गैर-तुच्छ) उदाहरण है जहां आप अग्रेषण संदर्भ पर 'std :: forward' नहीं बुलाएंगे? आप स्थानीय चर के लिए 'ऑटो &&' केस का भी उल्लेख कर सकते हैं। – vsoftco

+1

@ vsoftco 'टेम्पलेट शून्य foo (F && arg) {उपयोग (arg); use_again (आर्ग); उपभोग करें (std :: आगे (तर्क)); } ' – Barry

+0

स्व-स्पष्टीकरण, धन्यवाद, हालांकि आप अभी भी आगे बढ़ रहे हैं :) – vsoftco

9

दुर्भाग्यवश, यह भ्रमित है, लेकिन वे एक ही चीज़ के लिए दो से अधिक नाम नहीं हैं।
यूनिवर्सल संदर्भ प्रस्तावित (मुझे लगता है) बहुत पहले मेयर्स द्वारा (उदाहरण के रूप में here देखें)।
अग्रेषण संदर्भ मानक से सीधे उठाया जाता है। बस इतना ही।

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