【发布时间】:2015-08-05 05:09:03
【问题描述】:
这段代码定义明确吗?
int main()
{
union
{
int i;
float f;
} u;
u.f = 5.0;
u.i = u.f; // ?????
}
它在一个表达式中访问两个不同的工会成员,所以我想知道它是否违反了 [class.union]/1 关于工会的活动成员的规定。
C++ 标准似乎没有明确说明哪些操作会更改内置类型的活动成员,以及如果读取或写入非活动成员会发生什么。
【问题讨论】:
-
第二个分配不会让
u.i成为活跃成员而u.f成为非活跃成员吗? -
否:如果一个函数被声明为返回一个值,但没有,这是未定义的行为(我开玩笑,我假设你在谈论
union赋值)。 -
我想说的是,由于
u.f的值计算是在赋值的副作用之前排序的,所以在任何时候都不会模棱两可哪个成员是活动成员,而且在任何时候time 是正在读取的非活动成员。相关语句的行为应与auto temp = u.f; u.i = temp;相同 -
@Tas
main比较特殊,见 3.6.1/5
标签: c++ language-lawyer unions