【发布时间】:2019-04-23 16:00:25
【问题描述】:
其中哪些是未定义的行为:
template <class T> struct Struct { T t; };
template <class T> union Union { T t; };
template <class T> void function() {
Struct aS[10];
Union aU[10];
// do something with aS[9].t and aU[9].t including initialization
T *aSP = reinterpret_cast<T *>(aS);
T *aUP = reinterpret_cast<T *>(aU);
// so here is this undefined behaviour?
T valueS = aSP[9];
// use valueS in whatever way
// so here is this undefined behaviour?
T valueU = aUP[9];
// use valueU in whatever way
// now is accessing aS[9].t or aU[9].t now UB?
}
是的,最后 3 个操作中哪个是 UB?
(我的推理:我不知道结构,如果有任何要求它的大小与其单个元素相同,但 AFAIK 联合必须与元素的大小相同。我不知道联合的对齐要求,但我猜是一样的。对于结构我不知道。在联合的情况下,我猜它不是UB,但正如我所说,我是真的真的不确定。对于结构我真的不知道)
【问题讨论】:
-
你认为哪个是 UB,为什么,为什么你不确定?
-
不要让我们为您做功课,而是告诉我们您的想法和原因,并要求我们更正或确认一些具体的推理。
-
另见stackoverflow.com/a/25377970/560648 和en.cppreference.com/w/cpp/types/is_standard_layout。
T是什么?您没有构造任何Ts,但取决于T是什么,这可能无关紧要......但您必须提供所有必要的信息和上下文。 -
如给定的,最后两个操作都是UB。