2016-08-01 14 views
5

काम पर मैं लिनक्स और सी ++ 11 और सी ++ 14 के लिए जीसीसी कंपाइलर का उपयोग कर रहा हूं। काम पर कोड के कुछ में, मैं एक संघ का उपयोग किया है, के रूप में तो दोनों एक संदर्भ और एक सूचक स्टोर करने के लिए: (बस के लिए महत्वपूर्ण भागों सरलीकृत)संदर्भ के साथ संघ का उपयोग

struct MyStruct 
{ 
    //Stuff 
    union { double& x; double* x_ptr; }; 
    MyStruct(double& value) : x(value) {} 
    //More stuff 
}; 

मेरा मानना ​​है कि इस कोड को स्पष्ट, पठनीय है, अस्पष्ट, और उन संदर्भों को संग्रहीत करने का एक सुविधाजनक तरीका प्रदान करता है जिन्हें किसी और चीज़ में स्थानांतरित किया जा सकता है। यह पठनीयता में सुधार करते समय प्रदर्शन लागत के बिना आसानी से समझने योग्य वाक्य रचनात्मक चीनी प्रदान करता है। जब मैंने विजुअल स्टूडियो 15 में इस तरह के कोड का उपयोग करने का प्रयास किया, हालांकि, "डबल & प्रकार के अवैध यूनियन सदस्य" के कारण कोड संकलित करने में विफल रहा।

  1. क्या यह कोड मानक के तहत अवैध है, या केवल विजुअल स्टूडियो 2015 के तहत है?
  2. क्या मैं इसे विजुअल स्टूडियो 2015 में संकलित कर सकता हूं, या एक बग रिपोर्ट/परिवर्तन अनुरोध/कुछ सबमिट कर सकता हूं?
  3. इस तरह से एक संघ का उपयोग बुरा व्यवहार है?

नोट: अपने काम में काफी सभी कोड लिनक्स के लिए लिखा है और जीसीसी के साथ संकलित, और मेरी विशेष परियोजना के लिए, सी ++ 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 में लपेटा जाता है, लेकिन जब नहीं यह सिर्फ संघ में है?

live example

उत्तर

8

@Brian के अलावा: आप इसे उदा का उपयोग करके संकलित कर सकते हैं std::reference_wrapper एक सादे संदर्भ के बजाय:

#include <functional> 

struct MyStruct 
{ 
    //Stuff 
    union { std::reference_wrapper<double> x; double* x_ptr; }; 
    MyStruct(double& value) : x(value) {} 
    //More stuff 
}; 

int main() 
{ 
    double value = 123; 
    MyStruct myStruct(value); 
} 

live example

8

यह गैरकानूनी एक संघ के लिए एक संदर्भ सदस्य को शामिल करने के लिए है। यह संभवतः इसलिए है क्योंकि सन्दर्भ वस्तुएं नहीं हैं और यह निर्दिष्ट नहीं है कि वे भंडारण पर कब्जा करते हैं या नहीं - इसलिए यह अन्य चर के साथ अपने भंडारण को साझा करने के संदर्भ के लिए थोड़ा समझ में आता है।

एक संघ में सदस्य कार्य (रचनाकार और विनाशक समेत) हो सकते हैं, लेकिन वर्चुअल (10.3) फ़ंक्शन नहीं। एक संघ के पास बेस क्लास नहीं होंगे। एक संघ का उपयोग बेस क्लास के रूप में नहीं किया जाएगा। यदि किसी यूनियन में गैर- संदर्भ प्रकार के स्थिर डेटा सदस्य हैं, तो प्रोग्राम खराब बना हुआ है।

([class.union]/2)

+0

जब एक struct संदर्भ होता है, संदर्भ सूचक के रूप में संग्रहीत किया जाता है। कोई अस्पष्टता नहीं है। –

+0

@JorgePerez यह हो सकता है। इसे कुछ मामलों में भी अनुकूलित किया जा सकता है। मानक द्वारा * यह निर्दिष्ट नहीं है *। – Brian

संबंधित मुद्दे