2016-09-29 9 views
7

इस कोड पर विचार करेंक्या ब्रांड्स एक सूचक टेम्पलेट तर्क अमान्य बनाते हैं?</p> <pre><code>int x = 0; template<int& I> struct SR {}; template<int* I> struct SP {}; SR<(x)> sr; SP<&(x)> sp; int main(void) { } </code></pre> <p>बजना ++ 3.8.0 शिकायत:

main.cpp:10:5: error: non-type template argument does not refer to any declaration 
SP<&(x)> sp; 
    ^~~ 
main.cpp:6:15: note: template parameter is declared here 
template<int* I> 
      ^

जी ++ 6.1.0 शिकायत:

main.cpp:10:8: error: template argument 1 is invalid 
SP<&(x)> sp; 
     ^

स्वाभाविक रूप से, सब कुछ ठीक काम करता है अगर मैं कोष्ठकों निकालने के लिए, जैसा कि SP<&x> sp; में है। लेकिन मुझे सी ++ 14 मानक में कुछ भी नहीं मिला है जो यहां एक अंतर डाल देगा। इसके अलावा, संदर्भ केस ठीक क्यों है लेकिन सूचक मामले खराब है? क्या प्रोग्रामर प्रोग्राम को अस्वीकार करने के लिए सही हैं?

+0

@LightnessRacesinOrbit: यह एक [और (std :: अदालत) -as-टेम्पलेट तर्क] (http://stackoverflow.com/questions/39776437/c-stdcout-as-template-argument) – Jarod42

+0

क्षमा करें, हाँ। मैंने आदेश के बारे में एक नया और सीधा सवाल उठाया, क्योंकि पुराने प्रश्न में कैसे जवाब दिया गया था "केवल कोष्ठक हटाएं"। – aschepler

+0

मुझे लगता है कि इस तथ्य के साथ यह करना है कि किसी ऑब्जेक्ट के नाम के चारों ओर कोष्ठक जोड़ना अभिव्यक्ति को एक लाभा के बजाए एक रैवल्यू उत्पन्न करता है। – templatetypedef

उत्तर

4

मानक की मेरी पढ़ाई यह है कि इसे अनुमति दी जानी चाहिए, लेकिन मुझे लगता है कि जीसीसी और क्लैंग के कार्यान्वयनकर्ता मेरी व्याख्या से असहमत हैं, और वे शायद सही हैं। एक निश्चित उत्तर के लिए, [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])।
+0

हम्म। क्या N4296 सी ++ 14 के करीब नहीं है? N4296 में, [temp.arg.nontype] मूल रूप से केवल कुछ प्रतिबंधों के साथ "परिवर्तित निरंतर अभिव्यक्ति" को रोकता है। – aschepler

+0

@aschepler मुझे लगता है कि N4296 सी ++ 14 कामकाजी ड्राफ्ट के बाद में से एक है। मेरे उत्तर में संपादन भी देखें: मुझे लगता है कि जो शब्द आप देख रहे हैं वह C++ 17 में है। – Brian

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