पर विचार करें नीचेVS2013 डिफ़ॉल्ट प्रारंभ बनाम मूल्य प्रारंभ
struct B
{
B() : member{}{};
int member[10];
};
int main()
{
B b;
}
VS2013 संकलक कोड निम्न चेतावनी देता है:
चेतावनी C4351: नए व्यवहार: सरणी 'बी :: सदस्य' के तत्वों हो जाएगा डिफ़ॉल्ट प्रारंभ 1> test.vcxproj -> C: \ Users \ asaxena2 \ दस्तावेज \ दृश्य स्टूडियो 2013 \ परियोजनाओं \ परीक्षण \ डीबग \ test.exe
यह here
प्रलेखित है के साथ सी ++ 11, और 'डिफ़ॉल्ट प्रारंभ' की अवधारणा को लागू है, जिसका अर्थ है कि B.member के तत्वों आरंभ नहीं किया जा जाएगा।
लेकिन मेरा मानना है कि member{}
को मूल्य प्रारंभ करना चाहिए और डिफ़ॉल्ट प्रारंभिकता नहीं करना चाहिए। क्या वीएस2013 कंपाइलर टूटा हुआ है?
$ 8,5/6
प्रकार
T
की एक वस्तु डिफ़ॉल्ट आरंभ करने के लिए इसका मतलब है: - अगरT
(संभवत: सीवी-योग्य) वर्ग प्रकार (धारा 9),T
के लिए डिफ़ॉल्ट निर्माता कहा जाता है (और अगरT
में कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है तो प्रारंभिकता खराब है);
- यदिT
एक सरणी प्रकार है, तो प्रत्येक तत्व डिफ़ॉल्ट-प्रारंभ होता है;
- अन्यथा, कोई प्रारंभिकता नहीं की जाती है।
यदि कोई प्रोग्रामconst
की ऑब्जेक्ट के डिफ़ॉल्ट प्रारंभ के लिए कॉल करता है - योग्य प्रकारT
,T
उपयोगकर्ता द्वारा प्रदान किए गए डिफ़ॉल्ट कन्स्ट्रक्टर के साथ एक क्लास प्रकार होगा।
$ 8.5.1
एक वस्तु या प्रकार
T
के संदर्भ की सूची-प्रारंभ इस प्रकार परिभाषित किया गया है:
- प्रारंभकर्ता सूची में कोई तत्व है औरT
एक डिफ़ॉल्ट के साथ एक कक्षा प्रकार है निर्माता, वस्तु मूल्य-प्रारंभिक है।
- अन्यथा, यदिT
एक कुल है, कुल प्रारंभिक कार्य किया जाता है (8.5.1)।यदि कुल में सदस्यों के मुकाबले सूची में कम प्रारंभकर्ता-खंड हैं, तो प्रत्येक सदस्य को स्पष्ट रूप से प्रारंभ नहीं किया गया है, जिसे प्रारंभिक प्रारंभकर्ता सूची (8.5.4) से प्रारंभ किया जाएगा। [उदाहरण:
struct S { int a; const char* b; int c; }; S ss = { 1, "asdf" };
initializes
1
साथss.a
,"asdf"
साथss.b
, औरss.c
रूपint()
की अभिव्यक्ति के मूल्य के साथ, कि है,0
।अंत उदाहरण]
यह एक अच्छा सवाल है, लेकिन "विजुअल स्टूडियो कंपाइलर व्यवहार" एक भयानक शीर्षक है। इसे और अधिक अर्थपूर्ण में बदलने पर विचार करें। उस ने कहा, क्या आपने संकलक के व्यवहार की पुष्टि की है? यह सिर्फ एक भ्रामक चेतावनी हो सकता है। – hvd
@ एचवीडी: इसे बदल दिया। धन्यवाद – user3701522