2017-08-09 15 views
10

के आधार पर निम्न कोड ठीक है, एक निरंतर अभिव्यक्ति में प्रयोग करने योग्य है: अगर test के प्रकार const int से const double करने के लिए बदल जाता है,एक स्थिरांक चर का मान है या नहीं वैरिएबल प्रकार

constexpr double square_cstxpr(double x) { return x * x; } 

int main() { 
    const int test = 5; 
    constexpr double result = square_cstxpr((double)test); 
} 

हालांकि , g ++ निम्न त्रुटि देता है: the value of 'test' is not usable in a constant expressionhttp://coliru.stacked-crooked.com/a/2fe9b176c2b23798

किसी कि व्यवहार समझा सकते हैं:

कोड और यहाँ जी के ++ उत्पादन देखते हैं?

+0

कृपया उस कोड को जोड़ें जो इसे वर्णित करने के बजाय संकलित नहीं करता है। – molbdnilo

+1

@molbdnilo coliru के लिए एक लिंक है। – Zereges

+0

मेरे लिए ठीक बनाता है! – Geek

उत्तर

5

गैर- constexpr लेकिन const वेरिएबल निरंतर अभिव्यक्तियों में उपयोग करने योग्य होने के लिए पूर्णांक या गणना प्रकार का होना चाहिए। देखें [expr.const]/2:

an lvalue-to-rvalue conversion unless it is applied to

(2.7.1) a non-volatile glvalue of integral or enumeration type that refers to a complete non-volatile const object with a preceding initialization, initialized with a constant expression, or [..]

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

+0

कुछ साल पहले, सीडब्ल्यूजी ने ईडब्ल्यूजी के अनुरोध को निरंतर अभिव्यक्तियों में उपयोग करने योग्य 'कॉन्स्ट फ्लोट' बनाने के अनुरोध को खारिज कर दिया, आईआईआरसी। –

+0

@ टी.सी. वाई सीडब्ल्यूजी ने हर किसी को जीवन इतना कठिन बनाने के लिए किया? – r0ng

7

constant expression से (कोर निरंतर भाव):

10) Any other lvalue-to-rvalue implicit conversion, unless the lvalue...

a) has integral or enumeration type and refers to a complete non-volatile const object, which is initialized with a constant expression

इसका मतलब है, कि यहाँ:

const int test1 = 5; 
constexpr double result1 = square_cstxpr((double)test1); 

test1 एक निरंतर अभिव्यक्ति है, square_cstxpr संकलन समय पर एक तर्क के रूप test1 साथ कहा जा सकता है और इसके परिणाम को constexpr चरresult पर असाइन किया जा सकता है।

दूसरी ओर, यहां:

const double test2 = 5; 
constexpr double result2 = square_cstxpr((double)test2); 

test2 एक निरंतर अभिव्यक्ति है क्योंकि यह अभिन्न या गणन प्रकार की नहीं है नहीं है। नतीजतन, square_cstxpr को तर्क के रूप में test2 के साथ संकलन समय पर नहीं बुलाया जा सकता है।

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