2014-04-13 13 views
8

एक कंपाइलर त्रुटि में स्थिर परिणाम के बिना constexpr विशेषता के साथ एक संरचना का सदस्य बनाने का प्रयास (नीचे देखें)। ऐसा क्यों है? एक निरंतर मूल्य के लिए मेरे पास यह मान स्मृति में तब तक होगा जब तक कि प्रोग्राम को केवल ढांचे के दायरे के बजाय टर्मिनेट नहीं किया जाता है? क्या मुझे मैक्रो का उपयोग करने के लिए वापस जाना चाहिए?क्यों constexpr स्थिर होना चाहिए?

struct foo 
{ 
    constexpr int n = 10; 
    // ... 
}; 

error: non-static data member cannot be constexpr; did you intend to make it static? 
+0

ठीक है, इसे कॉपी करने से ज्यादा समझ नहीं आएगी। – Ben

+1

कई बार स्थिर स्मृति में एक बार बेहतर है, संरचना के प्रत्येक उदाहरण में से एक। – chris

+2

आपके पास प्रत्येक ऑब्जेक्ट के लिए 'constexpr' की एक प्रति क्यों होगी? –

उत्तर

12

मुझे आधिकारिक तर्कसंगत नहीं पता है। लेकिन निश्चित रूप से यह भ्रम पैदा कर सकता है। मैं, एक के लिए, यह नहीं देख सकता कि गैर-स्थैतिक डेटा सदस्य के लिए constexpr होने का क्या अर्थ है। क्या आप निम्नलिखित करने में सक्षम हैं?

struct foo { 
    constexpr int n = 10; 
    constexpr foo() { } 
    constexpr foo(int n):n(n) { } // overwrite value of n 
}; 

या इसका मतलब यह है कि प्रारंभकर्ता हमेशा स्थिर होना चाहिए, यानी आप ऊपर लिखने के लिए (/ संभावित गैर लगातार हो सका क्योंकि n स्थिर नहीं है), लेकिन कहने के लिए

foo f = { 10 }; 
अनुमति की अनुमति नहीं है

नियम constexpr int n स्पष्ट रूप से static होने के बजाए बीमार गठित है, यह मेरे लिए अच्छा लगता है, क्योंकि इसके अर्थशास्त्र स्पष्ट आईएमओ नहीं होंगे।

+0

मुझे 'constexpr int n = 10' के साथ कुछ भी गलत नहीं लगता है क्योंकि यह एक अभिन्न प्रकार है जिसे संकलन के दौरान 'n' के हर उपयोग को' परिभाषित 'के मामले में इसके मूल्य के साथ प्रतिस्थापित किया जाना चाहिए। वाक्यविन्यास बहुत स्पष्ट है, मुझे समझ में नहीं आता कि मानक इसे क्यों अनुमति नहीं देता है। –

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