यह POD structs containing constant member जैसा लगता है, लेकिन उलट की तरह।यूनियन युक्त अस्थिर structs
#include <iostream>
struct A
{
int a;
};
union U
{
volatile A a;
long b;
};
int main()
{
U u1;
U u2;
u1.a.a = 12;
u2 = u1;
std::cout << u2.a.a << std::endl;
return 0;
}
जी ++ 4.8.3 त्रुटि के बिना इस कोड को संकलित करता है और इसे सही ढंग से चलता है:
$ g++ -std=c++03 a.cpp -o a_gcc
$ ./a_gcc
12
लेकिन बजना ++ 3.5.1 (मैं मैन्युअल रूप से कोड बॉक्स रखने के लिए त्रुटि संदेश लपेटा है एक त्रुटि पैदा करता है स्क्रॉलिंग):
$ clang++ -std=c++03 a.cpp -o a_clang
a.cpp:8:7: error: member function 'operator=' not viable: 'this'
argument has type 'volatile A', but function is not marked volatile
union U
^
a.cpp:3:8: note: 'operator=' declared here
struct A
^
a.cpp:20:5: note: implicit copy assignment operator for 'U' first
required here
u2 = u1;
^
1 error generated.
क्या सी ++ 03 प्रोग्राम को अस्थिर structs युक्त संघ को प्रतिलिपि करने की अनुमति देता है? मुझे सी ++ 03 मानक में कुछ भी नहीं मिला जो संघ के डिफ़ॉल्ट प्रतिलिपि को परिभाषित करता है।
मैं जानना चाहता हूं कि कौन सा कंपाइलर सही है या मानक उस बिंदु पर स्पष्ट नहीं है।
संपादित करें: मुझे पता चला कि अगर मैं कॉपी असाइनमेंट के बजाय प्रतिलिपि निर्माण का उपयोग करता हूं तो दोनों clang ++ और g ++ त्रुटि के बिना प्रोग्राम संकलित करेंगे। विशेष रूप से अगर मैं main
बदल होने के लिए:
int main()
{
U u1;
u1.a.a = 12;
U u2 = u1;
std::cout << u2.a.a << std::endl;
return 0;
}
.. तो यह काम करेंगे। मुझे आश्चर्य है कि क्यों वे clang ++ द्वारा अलग तरीके से इलाज किया जाता है।
क्या होगा यदि आप 'यूनियन यू' में उपयोगकर्ता द्वारा परिभाषित असाइनमेंट ऑपरेटर जोड़ते हैं: 'अस्थिर यू और ऑपरेटर = (कॉन्स्ट अस्थिर यू &) अस्थिर'? या शायद उनमें से कुछ 'अस्थिर' के साथ? –
संघ के सदस्यों को अस्थिर होने की बजाय यूनियन अस्थिरता के उदाहरण क्यों नहीं बनाते? इस तरह के व्यवहार के बारे में कारण बनाना आसान लगता है। – BlamKiwi
@ जॉनजविनक क्योंकि तब यह इस समस्या का कारण नहीं बन जाएगा। – qbt937