पर विचार करें परस्पर संदर्भित प्रकार के निम्नलिखित जोड़ी:आरंभ किया जा रहा परस्पर-संदर्भित वस्तुओं
struct A;
struct B { A& a; };
struct A { B& b; };
यह जीसीसी में कुल आरंभीकरण के साथ प्रारंभ किया जा सकता है, बजना, इंटेल, MSVC, लेकिन नहीं SunPro कि उपयोगकर्ता परिभाषित ctors का कहना है जो आवश्यक हैं।
struct {A first; B second;} pair = {pair.second, pair.first};
क्या यह प्रारंभिक कानूनी है?
थोड़ा और अधिक व्यापक प्रदर्शन: http://ideone.com/P4XFw
अब, सूर्य की चेतावनी heeding, क्या उपयोगकर्ता परिभाषित कंस्ट्रक्टर्स के साथ कक्षाओं के बारे में? निम्नलिखित जीसीसी, क्लैंग, इंटेल, सनप्रो, और एमएसवीसी में काम करता है, लेकिन क्या यह कानूनी है?
struct A;
struct B { A& ref; B(A& a) : ref(a) {} };
struct A { B& ref; A(B& b) : ref(b) {} };
struct {B first; A second;} pair = {pair.second, pair.first};
डेमो: http://ideone.com/QQEpA
और अंत में, क्या हुआ अगर कंटेनर या तो तुच्छ नहीं है, उदाहरण के लिए (जी ++, इंटेल, बजना (चेतावनी के साथ) में काम करता है, लेकिन नहीं MSVC ("युग्मित" प्रारंभकर्ता में अज्ञात) या SunPro ("जोड़ी नहीं एक संरचना है")
std::pair<A, B> pair(pair.second, pair.first);
मैं क्या देख सकते हैं,
§3.8[basic.life]/6
मना करता है से
इससे पहले कि जीवन शुरू होता है एक गैर स्थिर डेटा सदस्य के लिए उपयोग, लेकिन pair.second "पहुँच" के लिए दूसरा? अगर ऐसा है, तो सभी तीन initializations अवैध हैं lvalue मूल्यांकन है? इसके अलावा, §8.3.2[dcl.ref]/5
कहते हैं, "संदर्भ एक का उल्लेख करने के प्रारंभ की जाएगी वैध ऑब्जेक्ट "जो शायद तीनों को भी अवैध बनाता है, लेकिन शायद मुझे कुछ याद आ रहा है और कंपेलर इसे किसी कारण से स्वीकार करते हैं।
पीएस: मुझे एहसास है कि ये कक्षाएं किसी भी तरह से व्यावहारिक नहीं हैं, इसलिए ला nguage-वकील टैग। संबंधित और मामूली रूप से अधिक व्यावहारिक वर्ष यहाँ चर्चा: Circular reference in C++ without pointers
मेरी आंत महसूस यह है कि आपके कुल निर्माण सही हैं (हालांकि मैं इसे अभी साबित नहीं कर सकता), जबकि 'std :: pair' के साथ गैर-समेकित संस्करण निश्चित रूप से आपके द्वारा बताए गए कारणों के लिए अनुमति नहीं है। आप एक सरल सवाल पूछ सकते हैं: 'स्ट्रक्चर फू {फू & r; फू (फू एंड एफ): आर (एफ) {}} एक्स (एक्स); ' –
क्या आप इसे पॉइंटर्स के साथ काम करने के लिए प्राप्त कर सकते हैं? –
दूसरा उदाहरण कानूनी नहीं है, जहां तक मैं कह सकता हूं, केवल समेकित (जो उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर नहीं हो सकता है) में ब्रेस-प्रारंभकर्ता हो सकते हैं: '§8.5 [dcl।init]/14' –