2012-03-20 14 views
9

मैं एक constexpr समारोह है कि कुछ इस तरह दिखता है:static_assert को कैसे बताना है कि constexpr फ़ंक्शन तर्क हैं?

constexpr int foo(int bar) 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 

    return something_const; 
} 

हालांकि, जीसीसी 4.6.3 के साथ इस संकलन मुझे बता रहता

त्रुटि: 'बार' एक निरंतर अभिव्यक्ति में प्रकट नहीं कर सकते हैं

मैं

constexpr int foo(constexpr const int bar) 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 

    return something_const; 
} 

की तरह कुछ कोशिश की, लेकिन constexpr समारोह तर्क के लिए इस्तेमाल नहीं किया जा सकता है।

क्या कंपाइलर को बताने का कोई आसान तरीका है कि बार हमेशा एक संकलित समय स्थिर रहता है?

+0

ओह, पूरी तरह से उस भाग को कोडित करना भूल गए। धन्यवाद @ हेनरिक – TravisG

+7

एक कॉन्स्टेक्स फ़ंक्शन को गैर-कॉन्स्ट तर्कों के साथ बुलाया जा सकता है, यह केवल इसके कॉन्स्टेक्सनेस को जब्त करता है। –

+1

धन्यवाद, मुझे यह नहीं पता था। – TravisG

उत्तर

16

Is there some simple way to tell the compiler that bar is always a compile time constant?

हैं bar हमेशा संकलन समय स्थिर है, तो आप अपने समारोह लिखना चाहिए के रूप में:

template<int bar> 
constexpr int foo() 
{ 
    static_assert(bar>arbitrary_number, "Use a lower number please"); 
    return something_const; 
} 

क्योंकि अगर आप ऐसा नहीं करते हैं, और बदले में लिखना क्या आप पहले से ही लिखा है, फिर उस स्थिति में, फ़ंक्शनगैर-कॉन्स तर्क के साथ भी कहा जा सकता है; यह सिर्फ इतना है कि जब आप गैर-कॉन्स्ट तर्क देते हैं, तो फ़ंक्शन इसे constexpr -ness को नुकसान पहुंचाएगा।

ध्यान दें कि उपरोक्त कोड arbitrary_number में लगातार अभिव्यक्ति होना चाहिए, अन्यथा यह संकलित नहीं होगा।

0

foo निम्नलिखित तरीके से इस्तेमाल किया जा सकता:

int i; 
std::cin >> i; 
foo("foo", i); 

आप देख सकते हैं i ठीक ऊपर एक निरंतर अभिव्यक्ति नहीं है, फिर भी यह अभी भी एक constexpr कार्यों के साथ इस्तेमाल किया जा सकता। constexpr फ़ंक्शन (और फ़ंक्शन टेम्पलेट्स) एक अजीब जानवर हैं जो गारंटी देते हैं उदा। foo(p, i) एक निरंतर अभिव्यक्ति iff p और i भी हैं, लेकिन अभी भी नियमित कार्यों की तरह उपयोग किया जा सकता है।

यदि आपके कार्यों के लिए तर्क हमेशा निरंतर अभिव्यक्तियों के लिए हैं, तो वे टेम्पलेट तर्क होना चाहिए, तर्कों का कार्य नहीं करना चाहिए।

5

constexpr कार्यों संकलन समय पर मूल्यांकन किया जा सकता है, यह सामान्य रूप में मानक से मजबूर नहीं कर रहा है (आप समारोह मजबूर कर सकते हैं इसके साथ एक constexpr चर आरंभ की तरह एक निरंतर अभिव्यक्ति के अंदर यह का उपयोग करके संकलन समय पर मूल्यांकन किया जाना) ।

इसके अलावा, constexpr फ़ंक्शन के तर्क वास्तव में स्थिर नहीं हैं, वे प्रत्येक कॉल के साथ बदल सकते हैं (भले ही संकलन समय पर मूल्यांकन किया गया हो)।

bar पास करने के लिए एक गैर-प्रकार के टेम्पलेट का उपयोग करना है, यदि यह हमेशा एक संकलित समय स्थिर होता है (जो ऐसा लगता है)।

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