struct S {T t { expr };};
एक गैर स्थिर डेटा सदस्य प्रारंभकर्ता कि बराबरी का उपयोग नहीं करता पर हस्ताक्षर है।
struct S{T t = { expr };};
एक गैर-स्थैतिक डेटा सदस्य प्रारंभकर्ता है कि बराबर चिह्न का उपयोग करता है।
पहला मामला है, जबकि दूसरा एक कॉपी-सूची-प्रारंभ है एक डायरेक्ट-सूची-प्रारंभ है।
डायरेक्ट-सूची-प्रारंभ और कॉपी-सूची-प्रारंभ के बीच अंतर यह है कि पहले मामले के लिए दोनों स्पष्ट और गैर स्पष्ट कंस्ट्रक्टर्स, माना जाता है, जबकि दूसरे केवल गैर स्पष्ट के लिए रचनाकारों को बुलाया जा सकता है।
स्पष्ट करने के लिए, निम्न उदाहरण पर विचार करें:
struct Foo {
int i;
explicit Foo(int i_) : i(i_) {}
};
struct Bar {
Foo f {1};
};
Live Demo
इस उदाहरण Foo
में एक explicit
निर्माता है और Bar
प्रत्यक्ष अपने सदस्य प्रकार Foo
की f
initializes। उदाहरण कोड सीधे शुरू होने के बाद से संकलित करता है क्योंकि explicit
और non-explicit
दोनों रचनाकारों पर विचार किया जाता है।
अब हम गैर-स्थैतिक डेटा सदस्य प्रारंभकर्ता को बराबर चिह्न के उपयोग के साथ बदलने के द्वारा उदाहरण को बदलते हैं, जो गैर-स्थैतिक डेटा सदस्य प्रारंभकर्ता को समान-चिह्न के उपयोग के साथ प्रत्यक्ष-सूची-प्रारंभिकता का मामला है, कॉपी-सूची-प्रारंभिकरण का मामला है।
struct Foo {
int i;
explicit Foo(int i_) : i(i_) {}
};
struct Bar {
Foo f = {1};
};
Live Demo
अब ऊपर के उदाहरण संकलन नहीं करता है और एक त्रुटि का उत्सर्जन करता है:
error: chosen constructor is explicit in copy-initialization
यह आशा की जाती है क्योंकि के रूप में पहले से ही कॉपी-सूची-आरंभीकरण केवल गैर स्पष्ट उल्लेख किया गया है रचनाकारों को बुलाया जा सकता है।
अब गणक और अन्य अभिन्न प्रकारों के लिए, ऊपर प्रदर्शित अंतर लागू नहीं होगा (यानी, कोई कन्स्ट्रक्टर शामिल नहीं है)। इस प्रकार, दो बयान (यानी, [1] और [2]) बराबर होंगे।
enum class Foo {A, B, C};
struct Bar {
Foo f{Foo::A};
};
और
enum class Foo {A, B, C};
struct Bar {
Foo f = {Foo::A};
};
दोनों उदाहरण ठीक संकलन:
लेकिन पूर्णता के लिए, निम्न उदाहरण पर विचार कर सकते हैं।
इसके अलावा निम्न उदाहरण पर विचार करें:
struct Bar {
int i {1};
};
और
struct Bar {
int i = {1};
};
दोनों उदाहरण भी ठीक संकलन।
क्यों होगा ..? –