काम पर मैं लिनक्स और सी ++ 11 और सी ++ 14 के लिए जीसीसी कंपाइलर का उपयोग कर रहा हूं। काम पर कोड के कुछ में, मैं एक संघ का उपयोग किया है, के रूप में तो दोनों एक संदर्भ और एक सूचक स्टोर करने के लिए: (बस के लिए महत्वपूर्ण भागों सरलीकृत)संदर्भ के साथ संघ का उपयोग
struct MyStruct
{
//Stuff
union { double& x; double* x_ptr; };
MyStruct(double& value) : x(value) {}
//More stuff
};
मेरा मानना है कि इस कोड को स्पष्ट, पठनीय है, अस्पष्ट, और उन संदर्भों को संग्रहीत करने का एक सुविधाजनक तरीका प्रदान करता है जिन्हें किसी और चीज़ में स्थानांतरित किया जा सकता है। यह पठनीयता में सुधार करते समय प्रदर्शन लागत के बिना आसानी से समझने योग्य वाक्य रचनात्मक चीनी प्रदान करता है। जब मैंने विजुअल स्टूडियो 15 में इस तरह के कोड का उपयोग करने का प्रयास किया, हालांकि, "डबल & प्रकार के अवैध यूनियन सदस्य" के कारण कोड संकलित करने में विफल रहा।
- क्या यह कोड मानक के तहत अवैध है, या केवल विजुअल स्टूडियो 2015 के तहत है?
- क्या मैं इसे विजुअल स्टूडियो 2015 में संकलित कर सकता हूं, या एक बग रिपोर्ट/परिवर्तन अनुरोध/कुछ सबमिट कर सकता हूं?
- इस तरह से एक संघ का उपयोग बुरा व्यवहार है?
नोट: अपने काम में काफी सभी कोड लिनक्स के लिए लिखा है और जीसीसी के साथ संकलित, और मेरी विशेष परियोजना के लिए, सी ++ 11 की गारंटी है और जीसीसी केवल संकलक कि इस्तेमाल किया जा रहा है है।
संपादित करें: कृपया मुझे यह न बताएँ कि संघ के अंदर संदर्भ डालने का कोई मतलब नहीं है "। जब एक संरचना के अंदर एक संदर्भ संग्रहीत किया जाता है, तो यह एक सूचक के रूप में एक ही मात्रा में स्थान लेता है। इसके अतिरिक्त, निम्न बजना के साथ संकलित:
struct MyStruct
{
//This will compile
union
{
struct { double& x; };
double* x_ptr;
};
//This won't compile; WHY?
/*union
{
double& x;
double* x_ptr;
};*/
MyStruct(double& val) : x(val){}
void Repoint(double& new_value)
{
x_ptr = &new_value;
}
};
यह क्यों संकलित करता है जब संदर्भ एक गुमनाम struct में लपेटा जाता है, लेकिन जब नहीं यह सिर्फ संघ में है?
जब एक struct संदर्भ होता है, संदर्भ सूचक के रूप में संग्रहीत किया जाता है। कोई अस्पष्टता नहीं है। –
@JorgePerez यह हो सकता है। इसे कुछ मामलों में भी अनुकूलित किया जा सकता है। मानक द्वारा * यह निर्दिष्ट नहीं है *। – Brian