2015-03-04 14 views
14

यह स्पष्ट है कि constexpr स्थिरांक का तात्पर्य लगता है और इस तरह यह देखने के लिए आम बात है:constexpr कॉन्स बनाम constexpr चर?

constexpr int foo = 42; // no const here 

लेकिन यदि आप लिखना:

constexpr char *const str = "foo"; 

तो जीसीसी "चेतावनी अंडे देगा: स्ट्रिंग निरंतर से करने के लिए पदावनत रूपांतरण ' char * '"if -Wwrite-string ध्वज पास हो गया है।

लेखन:

constexpr const char *const str = "foo"; 

मुद्दे को हल करती है।

तो constexpr स्थिरांक और constexpr वास्तव में एक ही कर रहे हैं?

उत्तर

24

मुद्दा यह है कि एक चर घोषणा में, constexpr हमेशा वस्तु को const -नेस लागू होता है की घोषणा की; दूसरी ओर const प्लेसमेंट के आधार पर एक अलग प्रकार पर लागू हो सकता है।

इस प्रकार

constexpr const int i = 3; 
constexpr int i = 3; 

बराबर हैं;

constexpr char* p = nullptr; 
constexpr char* const p = nullptr; 

समकक्ष हैं; दोनों pconst पॉइंटर char पर बनाते हैं।

constexpr const char* p = nullptr; 
constexpr const char* const p = nullptr; 

समकक्ष हैं। constexprpconst सूचक बनाता है। constconst char *pconst char पर इंगित करता है।

1

आप देख रहे हैं त्रुटि संदेश constexpr कीवर्ड से प्रति के साथ कोई संबंध नहीं है।

की तरह "foo" शाब्दिक एक स्ट्रिंग, के रूप में:

somefunction("foo"); 

इस स्ट्रिंग शाब्दिक के प्रकार const char * है। निम्न कथन:

char *const str = "foo"; 

यह एक char * मूल्य के लिए एक const char * मान देना कोशिश करता है। परिणामी char * मान गैर-परिवर्तनीय, निरंतर है, लेकिन उस समय तक त्रुटि पहले ही हुई है: const char * को char * में बदलने का प्रयास।

आपके उदाहरण में constexpr कीवर्ड केवल एक व्याकुलता है, और त्रुटि पर कोई असर नहीं पड़ता है।

+0

सच है, मुझे लगता है कि ओपी सही है, यह त्रुटि पर असर डालने के लिए _ought_ है। 'constexpr' और 'constexpr const' एक ही चीज़ होना चाहिए। –

+1

समस्या एक चार * के लिए एक कॉन्स char * का रूपांतरण है। चाहे परिणामी मूल्य एक आधार है, या एक constexpr, एक कारक नहीं है। उस बिंदु से पहले से ही त्रुटि हुई है। एक ही त्रुटि केवल एक सादा char * foo = "bar" के साथ होगी। –

+2

'foo' 'का प्रकार 'const const char [4]' है। –

-1

नहीं। यह कहना कि वे कर रहे हैं एक ही मतलब है कि कोई समय है कि स्थिरांक का उपयोग नहीं कर एक स्थिरांक संस्करण के लिए कार्यात्मक रूप से समान कोड के उत्पादन के बिना वैध होगा यह है कि।

मुझे सुरक्षित सिंगलेट्स के निर्माण में यह उपयोगी लगता है। मैंने इसे पूरी तरह से एक्सप्लोर नहीं किया है, और उम्मीद करेगा कि गैर-कॉन्स कॉन्टेक्सप्र के लिए अन्य वैध उपयोग हैं।

एक उदाहरण के रूप में, यहाँ कोड है कि गैर स्थिरांक constexpr की आवश्यकता है: एक चर के एक वैश्विक परिभाषा के साथ

प्रारंभ:

int global_int_; 

और अब हम एक constexpr समारोह है कि रिटर्न बना सकते हैं यह करने के लिए एक संदर्भ:

0:

constexpr int& get_global() 
{ 
    return global_int_; 
} 

अब हम उस संदर्भ कहीं और उपयोग कर सकते हैं

int main() 
{ 
    constexpr int& i{ get_global() }; 
    // do stuff with i 
    return 0; 
} 

अब हम गैर-कॉन्स int के रूप में i का उपयोग कर सकते हैं। यदि कॉन्स का निहित किया गया था, तो यह संभव नहीं होगा।

चूंकि गैर-कॉन्स्टेक्सप्रैफ़ वैध है, यदि आप कॉन्स्टेक्स का उपयोग कर रहे हैं, तो आपको इसे स्पष्ट रूप से घोषित करने की आवश्यकता होगी।

+2

यह एक पूर्ण लाल हेरिंग है। C++ 14 constexpr-not-implicitly-const सदस्य कार्यों के लिए है। –

+0

@ टी.सी. मैंने सदस्य समारोह के बिना गैर-कॉन्स कॉन्टेक्सप्र का एक उदाहरण प्रदान किया, इसलिए मुझे यकीन है कि आपका क्या मतलब है। –

+1

इसका सी ++ 14 परिवर्तन से कोई लेना देना नहीं है। पॉइंटर्स के साथ ही, 'constexpr' संदर्भ के लिए आवेदन कर रहा है (जो कि नो-ऑप है क्योंकि संदर्भों को संदर्भित किया जा सकता है) ऑब्जेक्ट के बजाए। –

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