2011-06-15 26 views
10
constexpr int get() { return 5; } 
template<int N> struct Test {}; 

int main() 
{ 
    int a[get()]; // ok 
    Test< get() > obj; // error:'int get()' cannot appear in a constant-expression 
} 

मेरे पास compiled this code with ideone है। और सोच रहा था कि यह संकलन त्रुटि क्यों दे रहा है। constexpr फ़ंक्शन template तर्क के रूप में अनुमति नहीं है या यह संकलक में एक बग है?क्या यह टेम्पलेट तर्क के रूप में constexpr फ़ंक्शन का उपयोग करने के लिए मान्य है?

संपादित: int get() इसके अलावा करने के लिए const int get() बदल गया है, वहाँ एक और बग ideone साथ कि, अगर आप constexpr तो still declaring an array is allowed को दूर है !! मुझे लगता है कि यह एक सी 99 सुविधा है।

+0

आपका संपादन गलत है, आपने इसे 'कॉन्स्टेक्स कॉन्स() 'बनाया है। – GManNickG

+0

@GMan, धन्यवाद ... – iammilind

+3

संपादन पर, यह एक सी 99 सुविधा है, और जीसीसी में यह एक विस्तार के रूप में है, लेकिन यह उचित सी ++ नहीं है, और यह पोर्टेबल नहीं होगा। इसे मानक में शामिल करने के लिए माना जाता था और अस्वीकार कर दिया गया था क्योंकि यह उस प्रकार के आविष्कार को तोड़ देगा जो आकार (आकार का हिस्सा है) संकलन समय पर जाना जाना चाहिए। सी में इससे कोई फर्क नहीं पड़ता है, लेकिन सी ++ में आप उस सरणी को एक टेम्पलेट के लिए एक प्रकार के तर्क के रूप में उपयोग करने में सक्षम नहीं होंगे (संकलित समय पर अज्ञात प्रकार अज्ञात) - जिस तरह से जीसीसी में व्यवहार होता है, यह वही होगा अगर आप इसे करने का प्रयास करते हैं तो शिकायत करें। –

उत्तर

13

जीसीसी 4.5 (कम से कम आइडिया पर इस्तेमाल किया गया संस्करण) पूरी तरह से constexpr का समर्थन नहीं करता है, जिसमें आपके वैध उपयोग शामिल हैं; यह const तक नीचे पानी। जीसीसी 4.6 और ऊपर सही ढंग से इसका समर्थन करता है।

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