这段代码是否已经定义良好?
int main()
{
union
{
int i;
float f;
} u;
u.f = 5.0;
u.i = u.f; // ?????
}
它在一个表达式中访问了两个不同的联合成员,因此我想知道它是否违反了[class.union]/1有关联合体“活动成员”的规定。
C++标准似乎未明确规定哪些操作会更改内置类型的活动成员,并且如果读取或写入非活动成员会发生什么。
u.i
成为活跃成员,而u.f
成为非活跃成员吗? - R Sahuunion
赋值)。 - Tasu.f
的值计算在赋值的副作用之前被排序,因此在任何时候都不会存在哪个成员是活动成员不明确的情况,并且在任何时候都不会从非活动成员中读取。所讨论的语句应该与auto temp = u.f; u.i = temp;
的行为相同。 - Igor Tandetnikmain
是特殊的,参见 3.6.1/5。 (翻译:@Tasmain
is special, see 3.6.1/5) - M.M