दिलचस्प पोस्ट
मैं git हुक में नए टैग पर प्रतिक्रिया कैसे करूं? संदर्भ बनाम से गुजरने में अंतर क्या है? मूल्य से गुजर रहा है? UIWebView: एप पृष्ठभूमि में प्रवेश करती है जब आईओएस 6 में HTML5 ऑडियो रोकता है Google App Engine में फ़ाइलें अपलोड करें पायथन और फ्लास्क के साथ डेटा स्ट्रीम करना 403 निषिद्ध बनाम 401 अनधिकृत HTTP प्रतिक्रियाएं जावा: एक्सप्लिप्स में एक .jar फ़ाइल को निर्यात करें एक पंक्ति से मिलान करने के लिए जावा रीगेक्स का उपयोग कैसे करें एक्लिप्स के लिए डार्क रंग योजना कैसे करें: x86 में पाउ (असली, असली) आप PHP स्क्रिप्ट कैसे डिबग करते हैं? जावा "+" का उपयोग करते हुए स्ट्रिंग कन्टेनटेनेशन कैसे करते हैं? मैं एसक्यूएल में एक महीने के पहले दिन कैसे चुन सकता हूं? डीडी में सी # में पासवर्ड रखने के लिए नमक के साथ एमडी 5 हैश अजगर कैसे एक मॉड्यूल फाइल को खोजता है अगर आयात स्टेटमेंट में केवल फ़ाइल नाम होता है?

सार्वभौमिक संदर्भों के लिए सिंटेक्स

यह एक रैवल्यू संदर्भ है:

void foo(int&& a); 

यह लावलुओं से बाँध नहीं करता है:

 int i = 42; foo(i); // error 

यह एक सार्वभौमिक संदर्भ है:

 template<typename T> void bar(T&& b); 

यह rvalues ​​के लिए बांधता है और यह भी lvalues ​​को बांधता है:

 bar(i); // okay 

यह एक रैवल्यू संदर्भ है:

 template<typename T> struct X { void baz(T&& c); }; 

यह लावलुओं से बाँध नहीं करता है:

 X<int> x; x.baz(i); // error 

क्यों सार्वभौमिक संदर्भ rvalue संदर्भों के समान सिंटैक्स का उपयोग करते हैं? क्या यह भ्रम का एक अनावश्यक स्रोत नहीं है? क्या समिति ने कभी भी वैकल्पिक वाक्यविन्यास जैसे T&&& T&* T&&& , T&* T&&& , T@ या T&42 (केवल उस आखिरी एक पर मजाक) पर विचार किया था? यदि हां, तो वैकल्पिक वाक्यविन्यास को अस्वीकार करने के कारण क्या थे?

वेब के समाधान से एकत्रित समाधान "सार्वभौमिक संदर्भों के लिए सिंटेक्स"

T&& जैसे एक सार्वभौमिक संदर्भ T को " ऑब्जेक्ट प्रकार " या " संदर्भ प्रकार " होने के लिए निकाल सकते हैं

आपके उदाहरण में यह आर के रूप में T को int रूप में निकाल सकता है, जब फ़ंक्शन पैरामीटर int&& , या यह T रूप में T अंतराल निकाल सकता है int& जब कोई लेवल्यू पास किया जाता है, तो उस स्थिति में फ़ंक्शन पैरामीटर int& (क्योंकि संदर्भ संक्षिप्त करने वाले नियम std::add_rvalue_reference<int&>::type सिर्फ int& )

यदि T फ़ंक्शन कॉल द्वारा (आपके X::baz उदाहरण के अनुसार) अनुमानित नहीं किया जाता है, तो इसे int& लिए अनुमानित नहीं किया जा सकता है, इसलिए संदर्भ एक सार्वभौमिक संदर्भ नहीं है।

तो IMHO वास्तव में नए सिंटैक्स की कोई ज़रूरत नहीं है, यह टेम्पलेट आर्ग्रेन कटौती और संक्षिप्त संदर्भ नियमों में अच्छी तरह से फिट बैठता है, छोटे ट्विक के साथ कि एक टेम्पलेट पैरामीटर संदर्भ प्रकार के रूप में अनुमानित किया जा सकता है (जहां C ++ 03 में एक फ़ंक्शन का टेम्पलेट पैरामीटर T या T& ए हमेशा एक ऑब्जेक्ट प्रकार के रूप में T को निकालते हैं।)

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

आईएमएचओ एक वैकल्पिक सिंटैक्स वास्तव में और भी भ्रमित होगा। यदि आपके पास सार्वभौमिक संदर्भ के लिए वाक्यविन्यास के रूप में template<typename T> void bar(T&@) , लेकिन जैसा कि हमने आज भी किया है, तो जब bar(i) टेम्प्लेट पैरामीटर T को int& or int रूप में अनुमानित किया जा सकता है फ़ंक्शन पैरामीटर का प्रकार int& … … न तो " T&@ " होगा (जो भी हो वह है)। तो आपको एक घोषणाकर्ता T&@ जे के लिए भाषा में व्याकरण होगा, जो कि एक ऐसा प्रकार नहीं है जो कभी भी हो सकता है मौजूद है, क्योंकि यह वास्तव में हमेशा किसी अन्य प्रकार को संदर्भित करता है, या तो int& या int&

कम से कम सिंटैक्स के साथ हमें एक प्रकार का T&& एंड एंड एक वास्तविक प्रकार मिल गया है, और संक्षिप्त संदर्भ नियम सार्वभौमिक संदर्भों का उपयोग करते हुए फ़ंक्शन टेम्पलेट्स के लिए विशिष्ट नहीं हैं, वे टेम्पलेट्स के बाहर बाकी प्रकार के सिस्टम से पूरी तरह अनुरूप हैं:

 struct A {} a; typedef A& T; T&& ref = a; // T&& == A& 

या समतुल्य:

 struct A {} a; typedef A& T; std::add_rvalue_reference<T>::type ref = a; // type == A& 

जब T एक लावल्यू संदर्भ प्रकार है, तो T&& भी है। मुझे नहीं लगता कि एक नया सिंटैक्स आवश्यक है, नियम वास्तव में जटिल या भ्रामक नहीं हैं।

क्यों सार्वभौमिक संदर्भ rvalue संदर्भों के समान सिंटैक्स का उपयोग करते हैं? क्या यह भ्रम का एक अनावश्यक स्रोत नहीं है? क्या समिति ने कभी वैकल्पिक सिंटैक्स पर विचार किया …

हां, यह भ्रामक है, आईएमओ (मैं यहां योनथन वाक्ली के साथ असहमत हूं)। मुझे याद है कि एक अनौपचारिक चर्चा के दौरान (दोपहर का भोजन, मुझे लगता है) समग्र विशेषता के शुरुआती डिजाइन के बारे में हमने अलग-अलग टिप्पणियों पर चर्चा की थी (हावर्ड हन्नेंट और डेव इब्राहीम उनके विचार ला रहे थे और ईडीजी के लोग इस बात पर प्रतिक्रिया दे रहे थे कि यह कैसे फिट हो सकता है कोर भाषा में, यह N1377 की भविष्यवाणी करता है)। मुझे लगता है मुझे याद है &? और &|&& विचार किया गया था, लेकिन यह सब मौखिक था; मुझे बैठक नोटों के बारे में जानकारी नहीं मिली है (लेकिन मेरा मानना ​​है कि यह भी जब जॉन ने आरव्यू के संदर्भ के लिए && amp; का उपयोग करने का सुझाव दिया) हालांकि, डिजाइन के शुरुआती चरण थे, और समय पर विचार करने के लिए बहुत सारे मौलिक अर्थ संबंधी मुद्दे थे। (उदाहरण, उसी दोपहर के भोजन चर्चा के दौरान हमने दो प्रकार के संदर्भ न होने की संभावना भी उठाई, लेकिन इसके दो प्रकार के संदर्भ पैरामीटर होने के बजाय।)

भ्रम के एक और हाल के पहलू को इस कारण "क्लास टेम्प्लेट आर्जेंट कटौती" (P0099R3) के सी ++ 17 फीचर में पाया गया है। वहाँ एक समारोह टेम्पलेट हस्ताक्षर कन्स्ट्रक्टर और कन्स्ट्रक्टर टेम्पलेट्स के हस्ताक्षर को बदलने के द्वारा बनाई गई है। कुछ के लिए:

 template<typename T> struct S { S(T&&); }; 

एक समारोह टेम्पलेट हस्ताक्षर

 template<typename T> auto S(T&&)->S<T>; 

एक घोषणा की तरह कटौती के लिए उपयोग करने के लिए बनाई गई है

 int i = 42; S s = i; // Deduce S<int> or S<int&>? 

डी कम करना T = int& अंतर T = int& यहाँ काउंटर-सहज ज्ञान युक्त होगा इसलिए हमें इस परिस्थिति में "विशेष कटौती नियम को अक्षम करने के लिए विशेष कटौती नियम" जोड़ना होगा 🙁