2016-07-15 16 views
6

निम्न कोड निरंतर अभिव्यक्ति के रूप में enum सदस्य m का उपयोग करता है, यानी टेम्पलेट पैरामीटर के रूप में। कोड जीसीसी के तहत संकलित है लेकिन क्लैंग (live demo) के तहत नहीं है। क्लैंग कहते हैं "त्रुटि: गैर-प्रकार का टेम्पलेट तर्क निरंतर अभिव्यक्ति नहीं है"।निरंतर अभिव्यक्ति के रूप में एक enum का उपयोग करना। कौन सा कंपाइलर सही है?

समस्या A<tst<p>::m> a द्वारा लाइन का आदान-प्रदान करके हल की जा सकती है। इसलिए, मेरा सवाल यह नहीं है कि इस समस्या को कैसे ठीक किया जाए, लेकिन कौन सा कंपाइलर सही है।

template<size_t n> struct A{}; 

template<size_t n> 
struct tst 
{ enum : size_t { m= n % 15 }; 

    template<size_t p> 
    void 
    call(tst<p> const &t2) { 
     A<t2.m> a; // 1 
    } 
}; 
+0

[यह संदर्भ कहता है] (http://en.cppreference.com/w/cpp/language/enum) "जब एक अनिश्चित गणना कक्षा का सदस्य होता है, तो उसके गणक वर्ग वर्ग एक्सेस ऑपरेटरों का उपयोग करके एक्सेस किया जा सकता है। और '->' "। हालांकि निरंतर अभिव्यक्ति होने के बारे में कुछ भी उल्लेख नहीं है। –

+1

@ जोआचिमपिलबोर्ग मानक '§ 7.2.2' कहता है ' एन्युमरेटर-सूची में पहचानकर्ता स्थिरांक के रूप में घोषित किए जाते हैं, और जहां भी स्थिरांक की आवश्यकता होती है वहां दिखाई दे सकते हैं। – lcs

उत्तर

3

मानक के मुताबिक, क्लैंग कोड को अस्वीकार करने का अधिकार है।

t2.m एक वर्ग सदस्य पहुंच अभिव्यक्ति है। [Expr.ref]/1 का कहना है:

[...] The postfix expression before the dot or arrow is evaluated; the result of that evaluation, together with the id-expression, determines the result of the entire postfix expression.

वहाँ भी एक नोट है:

If the class member access expression is evaluated, the subexpression evaluation happens even if the result is unnecessary to determine the value of the entire postfix expression, for example if the id-expression denotes a static member.

तो, उपसूचक t2 मूल्यांकन किया जाता है। [Expr.const] /2.9 का कहना है कि एक अभिव्यक्ति e एक कोर निरंतर अभिव्यक्ति अगर यह मूल्यांकन करने

an id-expression that refers to a variable or data member of reference type unless the reference has a preceding initialization and either

  • it is initialized with a constant expression or
  • its lifetime began within the evaluation of e ;

t2 के मूल्यांकन में परिणाम नहीं हो सकता संदर्भ प्रकार का एक चर कि गोलियां संतुष्ट नहीं करता है को संदर्भित करता है, तो t2.m निरंतर अभिव्यक्ति नहीं है क्योंकि यह कोर निरंतर अभिव्यक्ति नहीं है।


वर्तमान प्रकाशित कार्य ड्राफ्ट N4594 से सभी उद्धरण। सी ++ 11 के बाद से टेक्स्ट थोड़ा बदल गया है, लेकिन इस मामले में इसका अर्थ समान है।

+0

Thx। क्या किसी ने जीसीसी के लिए बग रिपोर्ट दर्ज की है? –

+0

@ क्लासबोंटस मैंने नहीं किया है। बग डेटाबेस के माध्यम से एक खोज क्रम में होगी, लेकिन मुझे अब तक ऐसा करने का समय नहीं मिला। – bogdan

+0

संभवतः [बग 39 9 70] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39970)। –

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