【问题标题】:Is accessing one member in a union that copied from a union with another member set undefined or unspecified?是否访问从联合中复制的联合中的一个成员,而另一个成员集未定义或未指定?
【发布时间】:2019-11-22 23:30:31
【问题描述】:

考虑以下代码片段,假设AB 都是大小相同的普通类型,例如int64_tdouble,或类似的东西:

union Punner {
  A x;
  B y;
};

Punner copy(Punner in)
{
  return in;
}

A pun(B in)
{
  Punner temp;
  temp.y = in;
  return copy(temp).x;
}

虽然我知道temp.y = in 行开始了tempy 成员的生命周期并且读取temp.x 将是未定义的,但当我从@987654333 获得Punner 类型的新副本时@函数,是否假设副本的y成员的生命周期也已经开始,并且读取副本的x成员仍然未定义,或者它只是未指定,并且在获得副本后,我实际上可能从xy 随意(在这种情况下从 x 读取)?

我知道我的问题在某些方面与this 相似,但遗憾的是,我无法从对我的问题的回答中自信地确定一个准确的答案。

【问题讨论】:

标签: c++ c++11 type-punning


【解决方案1】:

你应该想想内存中实际发生了什么。

Punner temp; //data in memory could be anything

temp.y = in; //data contains 8 bytes that describe an integer with the value in

copy(temp); //the copied data is 8 bytes that describe an integer with the value in

copy(temp).x; //accessing those 8 bytes as if they describe a double : getting giberish.

【讨论】:

  • 显然返回的数字将是胡言乱语,但我问的是结果是未指定还是未定义。
  • 是的,我的意思是 8。如果它未指定或未定义,您是什么意思?两者似乎是同义词。我向你描述了我所知道的任何编译器在内存中实际发生的情况。
  • 它们并不完全是同义词。未定义的行为是应该始终避免的,但未指定的行为不一定是坏事,只是没有指定结果。
  • 我专门考虑了 A 和 B 大小完全相同的情况。显然,如果它们的大小不同,那将是各种各样的坏事。此外,允许“未定义的行为”导致崩溃。可能不会,但可能会。未指定的行为就是 - 未指定。就我而言,我在问xy 中的哪个成员在copy 的返回中恰好醒着?还是未指定?
  • 但是我在问一个人是否有一个从其他地方复制的联合的新副本,是否明确定义为始终与复制它的联合相同,还是只是未指定?
猜你喜欢
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多