2015-12-28 7 views
9

मैंने हाल ही में अपने कोड में अधिक सी ++ 11 फीचर्स का उपयोग करना शुरू कर दिया है और मैं सोच रहा हूं कि constexpr कीवर्ड की नियुक्ति अंतर बनाती है चाहे वह निरंतर प्रकार के पहले या बाद में हो।सी ++ constexpr कीवर्ड प्लेसमेंट

शैली 1:

constexpr int FOO = 1; 
constexpr auto BAR = "bar"; 

शैली 2:

int constexpr FOO = 1; 
auto constexpr BAR = "bar"; 

शैली 2 तरह से मैं पसंद करते हैं const कीवर्ड जगह और constexpr उसी तरह कुछ स्थिरता लाना होगा रखने है कोड के लिए। हालांकि, क्या यह बुरा अभ्यास माना जाता है या शैली 2 के साथ कुछ और गलत है क्योंकि मैं वास्तव में इसे लिखने वाले किसी को भी नहीं देखता हूं।

उत्तर

10

यह एक विशिष्ट है, जैसे long, short, unsigned, आदि। वे सभी को स्थानांतरित किया जा सकता है। उदाहरण के लिए, निम्न दो बराबर और वैध घोषणाओं हैं:

int long const long unsigned constexpr foo = 5; 
constexpr const unsigned long long int foo = 5; 

परंपरा के मुताबिक, हालांकि, constexpr प्रकार नाम से पहले प्रदर्शित होगी। यदि आप इसे बाद में डालते हैं तो यह दूसरों को भ्रमित कर सकता है, लेकिन यह तकनीकी रूप से मान्य है। चूंकि constexprconst से भिन्न उद्देश्य प्रदान करता है, इसलिए मुझे इसे दाईं ओर रखने में समान लाभ दिखाई नहीं देता है। उदाहरण के लिए, आप int constexpr * constexpr foo नहीं कर सकते हैं। वास्तव में, int constexpr * foo आपको foo पर लागू होने के बजाय foo को फिर से सौंपने की अनुमति नहीं देगा, इसलिए यदि आप उसी तरह के अर्थशास्त्र को const के रूप में अपेक्षा करते हैं तो इसे दाईं ओर डालना गलत हो सकता है।

संक्षेप में:

int constexpr foo = 0; // valid 
int constexpr * constexpr foo = nullptr; // invalid 
int* constexpr foo = nullptr; // invalid 
int constexpr * foo = nullptr; // valid 
constexpr int* foo = nullptr; // valid and same as previous 
+0

बस शब्दों के बारे में। "_ वे सभी को चारों ओर ले जाया जा सकता है" को समझा जा सकता है "_it इससे कोई फर्क नहीं पड़ता कि आपने 'const'_' रखा है, जो मामला नहीं है क्योंकि यह अर्थ बदलता है। – AlexD

+0

@AlexD, सच है, मैंने इसे थोड़ा बढ़ा दिया होगा। मुख्य बिंदु यह था कि वे "बेस टाइप" (उदा।, 'Int') से पहले या बाद में किसी भी क्रम में दिखाई दे सकते हैं, जब तक '*' जैसी कुछ न हो, जहां व्याकरण अधिक विशिष्ट हो रहा है। घोषणा व्याकरण सबसे सरल भागों में से एक नहीं है। – chris

+0

निश्चित रूप से। जैसा कि मैंने कहा, मेरी टिप्पणी बस शब्द के बारे में थी :-)। – AlexD

1

msdn के रूप में वाक्य रचना को परिभाषित करता है:

constexpr शाब्दिक प्रकार पहचानकर्ता = निरंतर अभिव्यक्ति; constexpr शाब्दिक प्रकार पहचानकर्ता {निरंतर अभिव्यक्ति}; constexpr शाब्दिक प्रकार पहचानकर्ता (पैरा); constexpr ctor (पैरा);

जो कहता है कि आपको इसे बाईं ओर उपयोग करना चाहिए।

संपादित करें:

न्यू विनिर्देशक कीवर्ड constexpr एक घोषणा विनिर्देशक है, [ISO03, §7 में व्याकरण को संशोधित करें।1] के रूप में इस प्रकार है:

भंडारण-वर्ग-विनिर्देशक

प्रकार-विनिर्देशक

समारोह-विनिर्देशक

:

1 विनिर्देशक है कि एक घोषणा में इस्तेमाल किया जा सकता डीईसीएल-विनिर्देशक हैं

दोस्त

टाइपपीफ

constexpr

एक व्याख्या यह विनिर्देशक here के लिए दिया जाता है।

@ क्रिसिस का जवाब देने के लिए सही है :)

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