2016-08-07 19 views
15

मैं स्कॉट के अंतिम मास्टर टुकड़े में सी ++ 11 और 14 के बारे में सार्वभौमिक संदर्भों के बारे में पढ़ रहा हूं, जिसमें कहा जा सकता है कि किसी भी शब्द या लालसा प्रकार के लिए असाइन किए गए तर्क के बावजूद संदर्भ पैरामीटर में सार्वभौमिक संदर्भ नामक कुछ है जो पारित तर्क के प्रकार के आधार पर एल/रावल्यू को घटा सकता है। मैं समझ सकते हैं क्या एक सार्वभौमिक संदर्भ के रूप में पैरामीटर, लेकिन यह मेरे लिए स्पष्ट नहीं है एक बात है क्यों प्रकार पैरामीटर const T&& p को स्थिरांक जोड़ने rvalue के रूप में पी कर बनाता है:क्यों 'कॉन्स्ट' जोड़ना सार्वभौमिक संदर्भ बनाता है

template<typename T> 
void f(T&& param); // param is an universal reference 

template<typename T> 
void f(const T&& param); // param is an rvalue reference 

const से अधिक कार्य करती है यह संदर्भ पैरामीटर को असाइन किए जाने पर।

उत्तर

11

आधिकारिक नाम सार्वभौमिक संदर्भ नहीं है, लेकिन forwarding reference है। Standard कहा गया है कि सीवी-अयोग्य टेम्पलेट मापदंडों के केवल rvalue संदर्भ इस श्रेणी में आते हैं: एक समारोह कॉल [temp.deduct.call]

3 से

14.8.2.1 बात का अनुमान लगाना टेम्पलेट तर्क यदि पी एक सीवी-योग्य प्रकार है, तो पी के प्रकार के शीर्ष स्तर के सीवी-क्वालीफायरों को प्रकार की कटौती के लिए अनदेखा किया जाता है। यदि पी एक संदर्भ प्रकार है, तो पी 0 द्वारा संदर्भित टाइप प्रकार का कटौती के लिए उपयोग किया जाता है। एक अग्रेषण संदर्भ एक सीवी-अयोग्य टेम्पलेट पैरामीटर के लिए एक रैल्यू संदर्भ है। यदि पी अग्रेषण संदर्भ है और तर्क एक अंतराल है, तो प्रकार के लिए "lvalue संदर्भ" का उपयोग ए के प्रकार के कटौती के स्थान पर किया जाता है। [उदाहरण:

template <class T> int f(T&& heisenreference); 
template <class T> int g(const T&&); 
int i; 
int n1 = f(i); // calls f<int&>(int&) 
int n2 = f(0); // calls f<int>(int&&) 
int n3 = g(i); // error: would call g<int>(const int&&), which 
       // would bind an rvalue reference to an lvalue 

- अंत उदाहरण]

const T&& की अनुमति दे के रूप में अग्रेषण संदर्भ व्यवहार करने के लिए, यह असंभव एक टेम्पलेट समारोह जो पैरामीटर के रूप में केवल एक rvalue संदर्भ लेता ओवरलोड होगा।

अद्यतन: के रूप में @HowardHinnant टिप्पणी में उल्लेख है, const T&& इसके उपयोग (यह भी देखें this Q&A) करता है।

+1

ओपी को उलझन में प्रभावशाली मॉडर्न सी ++ _ में आइटम 24 के हिस्से में वापस टाई करने के लिए, स्कॉट का वर्णन (ढीले) सार्वभौमिक संदर्भों को रेवल्यू संदर्भों का वर्णन करने के लिए संदर्भित करें। 14.8.2.1 मानक उद्धरण में पहली (गैर-जोरदार) वाक्य (_ "यदि पी एक सीवी-योग्य प्रकार है, तो पी के प्रकार ** के शीर्ष स्तर के सीवी-क्वालीफायर ** को कटौती के लिए अनदेखा किया जाता है ** _ _ स्पष्ट रूप से स्कॉट के बयान बताते हैं कि _ "यहां तक ​​कि 'कॉन्स्ट' क्वालीफायर की सरल उपस्थिति सार्वभौमिक होने से संदर्भ को अयोग्य घोषित करने के लिए पर्याप्त है" _ (पुस्तक, आइटम 24 से उद्धरण)। – dfri

+1

@dfri धन्यवाद, मेरे पास पास के ईएमसी ++ की डिजिटल कॉपी नहीं थी। – TemplateRex

+2

क्यों अधिक प्रेरणा के लिए: कभी-कभी हमें यह कहने की ज़रूरत होती है: केवल एक स्तर पर बाध्य न करें, केवल तब्दीलों के लिए: 'टेम्पलेट शून्य क्रेफ (कॉन्स्ट टी एंड&) = हटाएं;'। –

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