2014-05-09 12 views
6

निम्नलिखित कोड पर विचार करें:सी ++ 11 constexpr समारोह पास पैरामीटर

static constexpr int make_const(const int i){ 
    return i; 
} 

void t1(const int i) 
{ 
    constexpr int ii = make_const(i); // error occurs here (i is not a constant expression) 
    std::cout<<ii; 
} 

int main() 
{ 
    t1(12); 
} 

मैं क्यों make_const कॉल पर एक त्रुटि है?


अद्यतन

लेकिन यह एक काम करता है:

constexpr int t1(const int i) 
{ 
    return make_const(i); 
} 

बहरहाल, यह नहीं:

template<int i> 
constexpr bool do_something(){ 
    return i; 
} 

constexpr int t1(const int i) 
{ 
    return do_something<make_const(i)>(); // error occurs here (i is not a constant expression) 
} 
+1

ठीक है क्योंकि सामान्य मामले में, 'i'' void t1 (const int) में 'constexpr' नहीं है। – stefan

+1

मैं इसे कैसे बना सकता हूं, फिर? – tower120

+0

इसे एक टेम्पलेट तर्क बनाना आपका एकमात्र विकल्प है – stefan

उत्तर

8

constexpr फ़ंक्शन और constexpr चर संबंधित हैं, लेकिन विभिन्न चीज़ें हैं।

constexpr चर एक चर है जिसका मूल्य संकलन समय पर उपलब्ध होने की गारंटी है।

एक constexpr समारोह एक समारोह है कि, अगर constexpr तर्क, साथ में मूल्यांकन और बर्ताव करता है "ठीक से" इसके निष्पादन के दौरान होता है, संकलन समय पर मूल्यांकन किया जाएगा।

यदि आप एक गैर-constexprint को constexpr फ़ंक्शन पर पास करते हैं, तो यह जादुई रूप से इसे संकलित समय पर मूल्यांकन नहीं करेगा। हालांकि, इसे अपने इनपुट पैरामीटर के constexpr नेस को स्वयं के माध्यम से पारित करने की अनुमति दी जाएगी (सामान्य कार्य ऐसा नहीं कर सकते हैं)।

constexpr फ़ंक्शंस पर दस्तावेज और प्रतिबंध का मिश्रण है कि वे कैसे लिखे गए हैं और संकलक को निर्देश हैं।

इसका कारण यह है कि एक ही फ़ंक्शन को संकलन समय पर और रन टाइम पर मूल्यांकन करने की अनुमति देना है। यदि रनटाइम तर्क पारित किया गया है, तो यह एक रनटाइम फ़ंक्शन है। यदि constexpr तर्क पारित किए गए हैं, तो इसका संकलन समय पर मूल्यांकन किया जा सकता है (और यदि कुछ संदर्भों में उपयोग किया जाएगा)।

2

क्योंकि t1() एक constexpr समारोह नहीं है, पैरामीटर मैं एक रनटाइम वैरिएबल है ... जिसे आपतक नहीं पारित कर सकते हैंसमारोह। कॉन्सटेक्स उम्मीद करता है कि पैरामीटर संकलन समय पर ज्ञात हो।

+0

टी 1 कॉन्स्टेक्सर बनाना कुछ भी नहीं बदलेगा। –

+0

हां, मैं आपके सुझाव का परीक्षण करता हूं। वही पुरानी कहानी। – tower120

+0

@MarcGlisse t1() को कॉन्स्टेक्स फ़ंक्शन होने के लिए सही ढंग से गठित नहीं किया गया है, मैं इसे बनाने का सुझाव नहीं दे रहा था जिससे समस्या ठीक हो जाएगी। – paxos1977

6

const और constexpr के बीच एक महत्वपूर्ण अंतर यह है कि संकलन समय पर constexpr का मूल्यांकन किया जा सकता है।

constexpr int ii = make_const(i); लिखकर आप संकलक को बता रहे हैं कि संकलन समय पर अभिव्यक्ति को निकाला जाना है। चूंकि i रन-टाइम पर evaluted है, इसलिए संकलक ऐसा करने में असमर्थ है और आपको एक त्रुटि देता है।

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