2016-06-08 11 views
15

मैं निम्नलिखित typedef है:एक रावल्यू संदर्भ का संदर्भ क्यों जोड़ रहा है त्रुटि नहीं?

using int_ref = int&&; 

क्यों निम्नलिखित कोड एक त्रुटि का उत्पादन नहीं करता (या false प्रिंट)?

std::cout << is_same< int_ref, int_ref&& >::value; // prints 1 

मैं उम्मीद करेंगे कि int_ref&&int&& && के लिए विस्तार किया जाता है जो स्पष्ट रूप से संभव नहीं है। क्या मैं कुछ भूल रहा हूँ?

उत्तर

28

यह reference collapsing rules के कारण है।

मूल रूप से

(, typedefs, टेम्प्लेट पैरामीटर decltypes) हालांकि आप कुछ मामलों में एक संदर्भ अपने आप के लिए एक संदर्भ, नहीं लिख सकते हैं, तो आप जो गिर एक संदर्भ प्रकार के लिए एक संदर्भ, बनाने में जोड़ सकते हैं इस प्रकार है:

A& & -> A& 
A& && -> A& 
A&& & -> A& 
A&& && -> A&& 

आपके मामले में, int_refint&& है, इसलिए int&& &&int&& बन जाता है।


प्रासंगिक मानक बोली:

(N3337) [dcl.ref]/6: तो एक typedef (7.1.3), एक प्रकार टेम्पलेट पैरामीटर (14.3.1), या एक decltype-विनिर्देशक (7.1 .6.2) एक प्रकार TR कि एक प्रकार T लिए एक संदर्भ है, "सीवीTR के संदर्भ lvalue" प्रकार पैदा करने की कोशिश प्रकार बनाता है "lvalue को दर्शाता है T का संदर्भ ", जबकि सीवीTR" के प्रकार का निर्माण करने का प्रयास "TR टाइप करता है।

+0

आह, अच्छा! क्या आप किसी भी मौके से सी ++ विनिर्देश का संदर्भ रखते हैं जहां इसका उल्लेख किया गया है? – tobspr

+2

@tobspr Sure, – TartanLlama

+1

@tobspr जोड़ा गया है अगर आपने कभी किसी को "सार्वभौमिक संदर्भ" या "अग्रेषण संदर्भ" के बारे में बात की है, तो यह संदर्भ के सरलीकृत स्पष्टीकरण है कि कई लोगों को अभ्यास में अधिक सहज और उपयोगी लगता है। आपको कुछ कोने के मामलों में से एक मिला है जहां यह काम नहीं करता है। – Ixrec

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