c++ - Is a program, that doesn't use a default argument that would fail to bind to a reference parameter, legal? -
निम्नलिखित पर विचार करें:
#include & lt; iostream & gt; टेम्पलेट & lt; typename T & gt; Struct Foo {Foo (टी v = {}): var (v) {} टी var; }; Int main () {// फू & lt; int & gt; च; // int x = 42 को संकलित नहीं कर सकता; फू & LT; पूर्णांक में & amp; & gt; f (x); Std :: cout & lt; & lt; f.var; }
यह जीसीसी 4.8 में बना और सफलतापूर्वक चलाता है, लेकिन क्या यह कड़ाई से कानूनी है?
T v = {}
है T = int & amp;
के लिए अमान्य है, लेकिन इस डिफ़ॉल्ट तर्क का उपयोग नहीं किया जाता है।
मानक में पा सकते हैं केवल प्रासंगिक भाषा स्पष्ट रूप से यह स्पष्ट नहीं करती है कि यह कार्यक्रम मान्य नहीं है; विभिन्न तरीकों से इस विषय को छूने के बावजूद निम्न में से कोई भी पूरी तरह से प्रासंगिक नहीं है:
[C ++ 11: 8.3.6 / 1]:
यदि कोई प्रारंभिक-खंड पैरामीटर-घोषणा में निर्दिष्ट किया गया है यह प्रारंभिक-क्लॉज एक डिफ़ॉल्ट तर्क के रूप में उपयोग किया जाता है डिफ़ॉल्ट तर्कों का उपयोग कॉल में किया जाएगा, जहां अनुगामी तर्क गुम हैं।
[C ++ 11: 8.3.6 / 5]:
एक डिफ़ॉल्ट तर्क पैरामीटर प्रकार पर निहित रूप से परिवर्तित (खंड 4) है डिफ़ॉल्ट तर्क में समान सिमेंटिक बाधाएं होती हैं, प्रारंभिक रूप में पैरामीटर प्रकार के एक वेरिएबल की घोषणा में, प्रति-आरम्भिकरण सिमेंटिक (8.5) का उपयोग करते हुए। डिफ़ॉल्ट तर्क में नाम बाध्य हैं, और सिमेंटिक बाधाएं उस बिंदु पर चेक की जाती हैं, जहां पर डिफ़ॉल्ट तर्क प्रकट होता है। फ़ंक्शन टेम्पलेट्स में डिफ़ॉल्ट तर्कों के लिए और अर्थीय बाध्यताओं का नाम लुकअप और जांचना 14.7.1 में वर्णित क्लास टेम्प्लेट के रूप में किया जाता है [..]
[C + + 11: 8.3.6 / 9]:
फ़ंक्शन है हर बार डिफ़ॉल्ट तर्क का मूल्यांकन किया जाता है [..]
देखें 14.7.1 Implicit instantiation [temp.inst] / 13:
यदि कोई फ़ंक्शन टेम्पलेट एफ को ऐसे तरीके से कहा जाता है जिसकी डिफ़ॉल्ट तर्क का उपयोग करने की आवश्यकता होती है, तो निर्भर नाम देखे जाते हैं, शब्दों की बाधाओं की जांच की जाती है, और डिफ़ॉल्ट तर्क में इस्तेमाल किए गए किसी भी टेम्पलेट का तत्काल किया जाता है जैसे कि डिफ़ॉल्ट तर्क एक आरम्भिकता का उपयोग एक समान स्कोप, समान टेम्पलेट पैरामीटर और उसी एक्सेस के समान फ़ंक्शन टेम्पलेट विशेषज्ञ में किया गया था समारोह टेम्पलेट च उस बिंदु पर प्रयोग किया जाता है, सिवाय इसके कि जिस दायरे में एक समापन प्रकार घोषित किया गया है (5.1.2) - और इसलिए इसके संबंधित नाम स्थान - डिफ़ॉल्ट तर्क के लिए परिभाषा के संदर्भ से निर्धारित किए गए रहते हैं। इस विश्लेषण को डिफ़ॉल्ट तर्क तात्कालिकता कहा जाता है तत्काल मूलभूत तर्क फिर एफ के तर्क के रूप में उपयोग किया जाता है।
नीचे दिया गया उदाहरण भी एक ऐसा मामला दिखाता है जहां डिफ़ॉल्ट तर्क अयोग्य बन जाता है यदि तत्काल:
टेम्पलेट & lt; कक्षा T & gt; शून्य एफ (टी एक्स, टी वाई = ydef (टी ()), टी z = zdef (टी ())); कक्षा { }; एक zdef (ए); शून्य जी (ए, ए बी, ए सी) {एफ (ए, बी, सी); // कोई डिफ़ॉल्ट तर्क तात्कालिकता f (a, b); // डिफ़ॉल्ट तर्क z = zdef (T ()) instantiated f (a); // बीमार बनाया; Ydef घोषित नहीं किया गया है}
कोई ydef नहीं है, इसलिए इसका उपयोग करने वाला कॉल खराब बना हुआ है, लेकिन जो कॉल इसका उपयोग नहीं करते हैं वह ठीक है।
Comments
Post a Comment