2015-03-18 7 views
10

जीसीसी, क्लैंग, आईसीसी और एमएसवीसी सभी इस कोड को अस्वीकार करते हैं, लेकिन मुझे सी ++ मानक के नवीनतम कामकाजी मसौदे में कोई उल्लंघन नियम नहीं मिला है।क्या टेम्पलेट का एक nonstatic सदस्य डेटा या समारोह के लिए विशेषज्ञ कर सकते हैं?

नियम पहले से ही मानक में है, या यह एक दोष रिपोर्ट में है?

#include <type_traits> 

template< typename t > 
struct s { 
    std::conditional_t< std::is_integral<t>::value, t, void() > mem; 
}; 

s<int> a; 
s< void * > b; 
+0

आप क्या उम्मीद करते हैं कि 'शून्य()' का मूल्यांकन करना चाहिए? – StenSoft

+0

@StenSoft 'शून्य()' केवल 'mem' का प्रकार है। आप ' :: mem' का मूल्यांकन नहीं कर सकते, क्योंकि यह एक अनुपूरक फ़ंक्शन का नाम है। लेकिन यह सवाल के दायरे से बाहर है। – Potatoswatter

+0

शून्य() फ़ंक्शन प्रकार, आमतौर पर टेम्पलेट प्रकार की कटौती के लिए उपयोग किया जाता है, एक var परिभाषित या घोषित नहीं करता है। –

उत्तर

8

कोड अमान्य कारण 14.3.1/3 है:

एक घोषणा एक प्रकार के माध्यम से एक समारोह प्रकार एक टेम्पलेट पैरामीटर पर निर्भर प्राप्त कर लेता है और यह एक घोषणा जो ऐसा नहीं करता होती है तो शायद फ़ंक्शन प्रकार के लिए फ़ंक्शन घोषणाकर्ता के सिंटैक्टिक रूप का उपयोग करें, प्रोग्राम खराब गठित है।

यहां घोषणा का प्रकार टेम्पलेट पैरामीटर t पर निर्भर है, और इसलिए फ़ंक्शन प्रकार नहीं हो सकता है।

+0

आह, धन्यवाद! कभी वहां इसकी तलाश नहीं होती। यह नियम प्रकार निर्भरता पर चर्चा कर रहा है, और यह स्थानीय दायरे पर भी लागू होता है। IMHO यह बेहतर होगा [temp.dep.type] §14.6.2.1 में। – Potatoswatter

+0

... और, वैसे, एमएसवीसी और आईसीसी (v13.0.1) स्थानीय दायरे में इसका निदान करने में असफल रहे। – Potatoswatter

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

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