संकलित करता है और काम करता है, जहां तक मुझे पता है, आप केवल अपनी घोषणा if they are integral types की उसी पंक्ति में स्थिर कॉन्स सदस्यों को प्रारंभ कर सकते हैं। हालांकि, मैं अभी भी प्रारंभ और कुछ स्थिर स्थिरांक का उपयोग करने में सक्षम था दोगुना हो जाता है:गलत स्थिर कॉन्स प्रारंभिकरण जो
// compiles and works, values are indeed doubles
struct Foo1{
static const double A=2.5;
static const double B=3.2;
static const double C=1.7;
};
// compiles, but values are cast to int
struct Foo2{
static const int A=2;
static const int B=3;
static const double C=B/A; //becomes 1
};
// does not compile, Foo3::B cannot appear in a constant-expression
struct Foo3{
static const int A=2;
static const double B=3;
static const double C=A/B;
};
// does not compile, a cast to a type other than an integral or enumeration
// cannot appear in a constant-expression
struct Foo4{
static const int A=2;
static const int B=3;
static const double C=(double)A/B;
};
foo2 संकलित लेकिन foo2 :: सी 1 हो जाता है, तो शायद यह के रूप में यह संख्यानुसार एक है एक पूर्णांक के रूप में व्यवहार किया जाता है। Foo3 और Foo4 अपेक्षा के अनुसार भी संकलित नहीं करते हैं। हालांकि, मुझे समझ में नहीं आता क्यों Foo1 दोनों संकलित और सही तरीके से काम करता है। क्या यह विशिष्ट उपयोग स्वीकार किया जाता है? क्या यह कुछ अनुकूलन के कारण है? (मैंने -O1 और -O0 का उपयोग करने का प्रयास किया है)
नोट: जीएमयू 5.2.0 का उपयोग सेमेक के साथ और मानक को सी ++ 98 में सेट करना। सी ++ 11 पर स्विचिंग ठीक काम करता है (यानी, संकलित नहीं होता है और उन सदस्यों को constexpr पर स्विच करने के लिए कहता है)।
'-pedantic' स्विच जोड़ें, फिर जीसीसी भी 'Foo1' के बारे में शिकायत करेगा। http://melpon.org/wandbox/permlink/o35cpEXlgMedfvMT – dyp