struct
(ए) को परिभाषित करना संभव है जिसमें उपयोगकर्ता द्वारा परिभाषित कन्स्ट्रक्टर नहीं हैं, और (बी) जिसके लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न नहीं किया जा सकता है। उदाहरण के लिए, Foo
नीचे में:क्या यह उपयोगकर्ता द्वारा परिभाषित कन्स्ट्रक्टर की कमी के लिए एक गैर-डिफ़ॉल्ट-कंक्रीट करने योग्य संरचना के लिए मानक का उल्लंघन करता है?
struct Baz
{
Baz(int) {}
};
struct Foo
{
int bar;
Baz baz;
};
तुम अब भी कुल आरंभीकरण का उपयोग कर Foo
का उदाहरण बना सकते हैं:
Foo foo = { 0, Baz(0) };
मेरे सामान्य संकलक (VS2012) अनिच्छा से यह स्वीकार करते हैं, लेकिन यह 2 चेतावनी को जन्म देती है:
बेशकचेतावनी C4510: 'Foo': डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न नहीं किया जा सका।
चेतावनी C4610: struct 'फू' कभी नहीं instantiated जा सकता है - उपयोगकर्ता परिभाषित निर्माता आवश्यक
, मैं सिर्फ 2 गलत साबित कर दिया है चेतावनी # - आप अभी भी कुल आरंभीकरण का उपयोग कर इसे का दृष्टांत कर सकते हैं। मैंने कोशिश की गई ऑनलाइन कंपाइलर्स उपरोक्त को स्वीकार करने के लिए काफी खुश हैं, इसलिए मुझे लगता है कि वीएस2012 इस चेतावनी के साथ अत्यधिक आक्रामक है। लेकिन मैं यह सुनिश्चित करना चाहता हूं - क्या यह कोड ठीक है, या क्या यह तकनीकी रूप से मानक के कुछ अस्पष्ट हिस्से का उल्लंघन करता है?
यह निश्चित रूप से एक पूरी तरह से क्रांतिकारी कुल है, जिसे आप वर्णन करते समय तत्काल किया जा सकता है, सी ++ 11 के अनुसार। या तो पुरानी बोलीभाषाओं में कुछ अस्पष्ट था (जो मुझे संदेह है, लेकिन एक भाषा-वकील की तुलना में भाषा-इतिहासकार से भी कम होने की पुष्टि नहीं कर सकता), या संकलक इसकी चेतावनियों के साथ बहुत भारी है। –
बस चेतावनी से छुटकारा पाने के लिए, क्या आपने डिफ़ॉल्ट कन्स्ट्रक्टर को हटाने का प्रयास किया है, इसलिए संकलक असंभव प्रयास नहीं करता है? –
यह एक कन्स्ट्रक्टर-कम संरचना नहीं है। यह एक निश्चित रूप से घोषित प्रतिलिपि निर्माता है। –