读取与在联合中写入的成员不同的成员是否是未定义的行为?
union test{
char a; // 1 byte
int b; // 4 bytes
};
int main(){
test t;
t.a = 5;
return t.b;
}
这个链接说:https : //en.cppreference.com/w/cpp/language/union
从最近未写入的联合成员中读取是未定义的行为。
据此,我上面的示例代码有UB吗?如果是这样,那么联盟的意义何在?我认为重点在于从相同的内存位置读取/写入不同的值类型。
如果我需要访问该most recently written值,那么我将只使用常规变量而不是联合。
回答
是的,行为在 C++ 中是未定义的。
当您向 union 的成员写入值时,请考虑该成员成为active member。
读取任何非活动成员的联合成员的行为是未定义的。
在 C++ 中,aunion通常与另一个变量结合使用,作为识别活动成员的手段。