高手指点一下!!!!!!

时间:2021-02-04 10:50:25
union U1 {
int n;
}u1;
volatile   union   U1   u2;  
u2=u1;     //这条语句有错误

union stt{
int xx;
}sa;

union stt sb;
sa =sb;//这条可以成功

请问为什么,有什么不一样吗?

9 个解决方案

#1


volatile   union   U1   u2;   
u2=u1;     //这条语句有错误 
仔细看看有什么不同。变量名字换一下看看。

#2


把volatile去掉就可以了,这是类型不匹配问题。当然别忘记了初始化。

#3


多了个volatile   

#4


volatile 修饰的变量不能由自己的程序修改

#5


因为编译器自动合成的赋值运算不能作用在volatile对象上。
可以自己写一个volatile版本的赋值运算。

union U1 { 
int n;
// 用于volatile对象的赋值运算
// 请注意它以volatile对象为输入,并返回一个volatile对象
volatile U1& operator=(const volatile U1& u) volatile 

n = u.n;
return *this;
}
}u1; 

#6


与const类似,平凡对象可以转换为volatile对象,反之则不行。
所以对于cv对象的操作一般要另外编写。

#7


同样类似与const,要将volatile对象转换为平凡对象,可以使用const_cast,如:
u1 = const_cast<union U1&>(u2); // 这里调用编译器自动合成的U1& operator=(const U1& u);

#8


你这种用法即使成功,好像也不符合标准,union 不能直接赋值的!不能像结构体一样对象赋值的!

#9


引用 8 楼 lzpggg 的回复:
你这种用法即使成功,好像也不符合标准,union 不能直接赋值的!不能像结构体一样对象赋值的!

这种说法不对,union是一种自定义类型,除了它的特殊之处(如复用内存空间等等),与class或struct在很多地方都是类似的。事实上,"union"作为一种"class-key",是用来定义类(class)的,这就意味着union与class或struct的相似程度大大高于其他自定义类型(如enum)。应该这样理解union:除了标准中指出的不同,它和class或struct是一样的。
以下是标准中对union的定义(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[class]):
A union is a class defined with the class-key union; its members are public by default and it holds 
only one data member at a time...
此外,还有其他一些不同,这里就不一一列举了。
综上所述,为union定义函数或操作,是很自然的。

至于赋值,在C++标准中也有明确的示例,如(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[dcl.init.aggr]):
union u { int a; char* b; };
u a = { 1 };
u b = a; // here
事实上赋值比其他操作适用于更加广泛的类型;因为如果一个类型不能被赋值的话,它就不能被定义成类的数据成员了。

当然5楼到7楼的内容也都适用于class和struct。

#1


volatile   union   U1   u2;   
u2=u1;     //这条语句有错误 
仔细看看有什么不同。变量名字换一下看看。

#2


把volatile去掉就可以了,这是类型不匹配问题。当然别忘记了初始化。

#3


多了个volatile   

#4


volatile 修饰的变量不能由自己的程序修改

#5


因为编译器自动合成的赋值运算不能作用在volatile对象上。
可以自己写一个volatile版本的赋值运算。

union U1 { 
int n;
// 用于volatile对象的赋值运算
// 请注意它以volatile对象为输入,并返回一个volatile对象
volatile U1& operator=(const volatile U1& u) volatile 

n = u.n;
return *this;
}
}u1; 

#6


与const类似,平凡对象可以转换为volatile对象,反之则不行。
所以对于cv对象的操作一般要另外编写。

#7


同样类似与const,要将volatile对象转换为平凡对象,可以使用const_cast,如:
u1 = const_cast<union U1&>(u2); // 这里调用编译器自动合成的U1& operator=(const U1& u);

#8


你这种用法即使成功,好像也不符合标准,union 不能直接赋值的!不能像结构体一样对象赋值的!

#9


引用 8 楼 lzpggg 的回复:
你这种用法即使成功,好像也不符合标准,union 不能直接赋值的!不能像结构体一样对象赋值的!

这种说法不对,union是一种自定义类型,除了它的特殊之处(如复用内存空间等等),与class或struct在很多地方都是类似的。事实上,"union"作为一种"class-key",是用来定义类(class)的,这就意味着union与class或struct的相似程度大大高于其他自定义类型(如enum)。应该这样理解union:除了标准中指出的不同,它和class或struct是一样的。
以下是标准中对union的定义(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[class]):
A union is a class defined with the class-key union; its members are public by default and it holds 
only one data member at a time...
此外,还有其他一些不同,这里就不一一列举了。
综上所述,为union定义函数或操作,是很自然的。

至于赋值,在C++标准中也有明确的示例,如(摘自《C++ Standard--ISO/IEC 14882:2003(E)》之[dcl.init.aggr]):
union u { int a; char* b; };
u a = { 1 };
u b = a; // here
事实上赋值比其他操作适用于更加广泛的类型;因为如果一个类型不能被赋值的话,它就不能被定义成类的数据成员了。

当然5楼到7楼的内容也都适用于class和struct。