अगर मैं निम्नलिखित C++ 0x कोड को संकलित करने का प्रयास करें, मैं कोई त्रुटि मिलती है :एक ही कक्षा में स्थित खाके पैरामीटर के रूप में एक constexpr का उपयोग कर त्रुटि
test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition
test.cc:6:28: note: in template argument for type ‘int’
बजना 2.8 के साथ, त्रुटि संदेश है:
test.cc:6:20: error: non-type template argument of type 'int' is not an integral
constant expression
void function(foo<number()> &);
^~~~~~~~
1 error generated.
अगर मैं एक आधार ग constexpr
समारोह के लिए कदम लड़की, यह जीसीसी पर काम करता है, और बजना पर एक ही त्रुटि संदेश देता है:
template<int n> struct foo { };
struct base {
static constexpr int number() { return 256; }
};
struct bar : base {
void function(foo<number()> &);
};
कोड गलत है, या यह एक सीमा या C++ 0x की जीसीसी 4.6 के कार्यान्वयन पर बग है? यदि कोड गलत है, तो यह गलत क्यों है, और सी ++ 11 मानक के कौन से खंड कहते हैं कि यह गलत है?
हम्म .. मुझे लगता है कि हम सिर्फ चर्चा की इस पहले: इनलाइन समारोह परिभाषाओं व्यवहार कर रहे हैं जैसे कि वे परिभाषित किया गया * बस के बाद * वर्ग परिभाषा; तो कक्षा परिभाषा के अंदर वे अभी तक उपलब्ध नहीं हैं। ध्यान दें कि आप हमेशा 'स्थिर कॉन्स int संख्या = 256;' या 'स्थिर constexpr int संख्या = 256; 'इसके बजाय कह सकते हैं। –
@ केरेकस्क बी ओह, मैं कभी नहीं जानता था। आपको इसे एक उत्तर के रूप में लिखना चाहिए। –
@KerrekSB: AFAIK, यदि मैं 'स्थिर कॉन्स int संख्या = 256; 'का उपयोग करता हूं, तो मुझे' const int bar :: संख्या; 'की भी आवश्यकता होती है, जो' बेडा 'में 4 बेकार बाइट्स को अपर्याप्त रूप से जोड़ देगा। इनलाइन फ़ंक्शन का उपयोग करना इससे रोकता है। मुझे नहीं पता कि यह 'स्थैतिक constexpr int संख्या = 256;' के मामले में भी है, हालांकि। – CesarB