gpt4 book ai didi

c++ - 您可以将一个 union 成员的值(value)分配给另一个 union 成员吗?

转载 作者:IT老高 更新时间:2023-10-28 22:41:37 25 4
gpt4 key购买 nike

考虑以下代码片段:

union
{
int a;
float b;
};

a = /* ... */;

b = a; // is this UB?
b = b + something;

将一个 union 成员分配给另一个 union 成员是否有效?

最佳答案

不幸的是,我认为这个问题的答案是 C++ 中未指定 union 操作,尽管自分配完全没问题。

自赋值是明确定义的行为,如果我们查看草案 C++ 标准部分 1.9 程序执行 段落 15 有以下示例:

void f(int, int);
void g(int i, int* v) {
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // i becomes 9

i = i++ + 1; // the behavior is undefined
i = i + 1; // the value of i is incremented

f(i = -1, i = -1); // the behavior is undefined
}

i = i + 1 示例中介绍了自赋值。

这里的问题是 unlike C89 forward支持 C++ it is not clear 中的类型双关语.我们只知道:

In a union, at most one of the non-static data members can be active at any time

但正如 WG21 UB study group mailing list 中的讨论说明这个概念还不是很清楚,我们有以下意见:

While the standard uses the term "active field", it does not define it

并指出这个非规范性注释:

Note: In general, one must use explicit destructor calls and placement new operators to change the active member of a union. — end note

所以我们不得不怀疑:

b = a;

是否使b 成为活跃成员?我不知道,也没有办法用任何当前版本的标准草案来证明这一点。

尽管实际上大多数现代编译器例如 gcc支持 C++ 中的类型双关语,这意味着绕过了事件成员的整个概念。

关于c++ - 您可以将一个 union 成员的值(value)分配给另一个 union 成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22022826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com