मानक की मेरी पढ़ाई यह है कि इसे अनुमति दी जानी चाहिए, लेकिन मुझे लगता है कि जीसीसी और क्लैंग के कार्यान्वयनकर्ता मेरी व्याख्या से असहमत हैं, और वे शायद सही हैं। एक निश्चित उत्तर के लिए, [email protected] मेलिंग सूची से पूछना अच्छा विचार हो सकता है (मैं उन्हें एक ईमेल शूट करूंगा)। शब्द एक दोष हो सकता है।
[temp.arg.nontype] के अनुसार, एक गैर प्रकार टेम्पलेट तर्क के लिए संभव तरीकों में से एक है:
... एक निरंतर अभिव्यक्ति (5.19) है कि एक पूरा का पता निर्दिष्ट करता है जिनकी स्थिर भंडारण अवधि और बाहरी या आंतरिक लिंकेज या समारोह टेम्पलेट्स और समारोह टेम्पलेट-आईडी लेकिन गैर स्थिर वर्ग के सदस्यों को छोड़कर, व्यक्त (अनदेखी कोष्ठकों) सहित बाहरी या आंतरिक लिंकेज के साथ एक समारोह के रूप में &
आईडी-अभिव्यक्ति के साथ वस्तु, जहां आईडी-अभिव्यक्ति है एक वस्तु या समारोह, सिवाय अगर नाम एक समारोह या सरणी को संदर्भित करता है और यदि इसी टेम्पलेट पैरामीटर एक संदर्भ है लोप किया जाएगा &
हटाया जा सकता है कि के नाम ...
यह सब "कोष्ठक को अनदेखा करने" का अर्थ है। जीसीसी और क्लैंग दोनों (&x)
स्वीकार करते हैं लेकिन &(x)
नहीं; ऐसा लगता है कि उन्होंने "कोष्ठक को अनदेखा करना" का अर्थ केवल बाहरी पर है, आईडी-अभिव्यक्ति के आसपास नहीं। यदि यह मानक समिति का इरादा था, तो भाषा को स्पष्ट किया जाना चाहिए।
संपादित करें:C++17 draft में, यह स्पष्ट रूप से, की अनुमति दी है स्वीकार्य गैर टाइप टेम्पलेट तर्क के रूप के बाद से काफी आराम से कर दिया गया है
एक गैर प्रकार के लिए एक टेम्पलेट तर्क टेम्पलेट-पैरामीटरटेम्पलेट-पैरामीटर के प्रकार के एक परिवर्तित निरंतर अभिव्यक्ति ([expr.const]) होगा।
- एक subobject: एक गैर प्रकार टेम्पलेट पैरामीटर संदर्भ या सूचक प्रकार के, निरंतर अभिव्यक्ति के मूल्य का उल्लेख नहीं किया जाएगा के लिए (या एक सूचक प्रकार के लिए, की पता नहीं होगा) ([intro.object]),
- एक अस्थायी वस्तु ([वर्ग।अस्थायी]),
- एक स्ट्रिंग शाब्दिक ([lex.string]),
- एक
typeid
अभिव्यक्ति ([expr.typeid]), या - एक पूर्वनिर्धारित
__func__
चर का परिणाम ([dcl.fct.def .general])।
@LightnessRacesinOrbit: यह एक [और (std :: अदालत) -as-टेम्पलेट तर्क] (http://stackoverflow.com/questions/39776437/c-stdcout-as-template-argument) – Jarod42
क्षमा करें, हाँ। मैंने आदेश के बारे में एक नया और सीधा सवाल उठाया, क्योंकि पुराने प्रश्न में कैसे जवाब दिया गया था "केवल कोष्ठक हटाएं"। – aschepler
मुझे लगता है कि इस तथ्य के साथ यह करना है कि किसी ऑब्जेक्ट के नाम के चारों ओर कोष्ठक जोड़ना अभिव्यक्ति को एक लाभा के बजाए एक रैवल्यू उत्पन्न करता है। – templatetypedef