2015-05-31 8 views
6

मुझे कॉन्स और कॉन्टेक्सप्र के बीच का अंतर पता है। एक संकलन समय स्थिर है और दूसरा संकलन समय या रनटाइम निरंतर है।कॉन्स कॉन्सएक्सप्रैर चार * बनाम कॉन्सएक्सप्रैर चार *

हालांकि, वर्ण/तारों की सरणी के लिए, मैं उलझन में हूं कि संकलक दूसरे पर इस्तेमाल होने के बारे में शिकायत क्यों करता है।

उदाहरण के लिए मेरे पास है:

constexpr char* A[2] = {"....", "....."}; 

const constexpr char* B[2] = {"....", "....."}; 
घोषणा के साथ

'ए' मैं:

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] 

लेकिन घोषणा "बी" के साथ मुझे कोई चेतावनी मिलता है।

अतिरिक्त कॉन्स क्वालीफायर चेतावनी से कैसे छुटकारा पाता है? क्या वे दोनों "कॉन्स char *" वैसे भी नहीं हैं? मैं पूछता हूं क्योंकि दोनों को constexpr के साथ घोषित किया गया है जो इसे डिफ़ॉल्ट रूप से const char* बनाना चाहिए?

मैं एक अच्छा होने की उम्मीद थी: एस

+3

'constexpr' सूचक पर लागू होता है, जिससे इसे 'const' बना दिया जाता है, लेकिन वह ऑब्जेक्ट नहीं जो यह इंगित करता है। तो यह उन कुछ मामलों में से एक है जहां आपको 'const' और' constexpr' को गठबंधन करने की आवश्यकता हो सकती है। – 0x499602D2

+3

'constexpr char *' एक 'char * const' है। 'Constexpr' विनिर्देशक वस्तु के पूरे प्रकार पर लागू होता है - यह है, यह घोषणा पर लागू होता है-, 'const' एक योग्यता (एक प्रकार का) है। – dyp

उत्तर

8

const संकलक कि वर्ण आप इंगित कर रहे हैं के लिए लिखा नहीं किया जाना चाहिए करने के लिए कहता है।

constexpr कंपाइलर को बताता है कि उन सरणी में आपके द्वारा संग्रहीत पॉइंटर्स का संकलन समय पर पूरी तरह से मूल्यांकन किया जा सकता है। हालांकि, यह नहीं कहता कि क्या पॉइंटर्स पॉइंटर्स बदल रहे हैं या नहीं।

वैसे, एक और तरीका है कि आप इस कोड लिख सकता होगा:

const char * const B[2]; 

पहले const वर्ण पर लागू होता है, और दूसरा const सरणी ही है और संकेत दिए गए उसमें शामिल करने के लिए आवेदन किया।

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