【发布时间】:2018-06-08 00:03:16
【问题描述】:
如果唯一的后续使用是在如下所示的初始化语句中,那么是否UB返回一个结构而不初始化它:
typedef struct { int x; } s;
s callee(void) {
s ret;
return ret;
}
void caller() {
s dummy = callee();
}
【问题讨论】:
-
您似乎认为
struct是否未使用很重要;编译器无法确定的情况怎么办? -
@ScottHunter - 我不知道该结构未使用是否重要,这就是我问的原因。显然,在很多情况下编译器无法确定这一点,例如
callee和caller是否位于单独的编译单元中 - 但我不确定你在这里得到什么。我不是在问“如果编译器可以证明它是未使用的,它是否是 UB 返回一个 uninit 结构”-我是在问上面的模式是否是 UB。例如,return s可能是 UB(无论调用者如何),或者s dummy = callee()可能是 UB,也可能不是。 -
注意:某事物是否是 UB 是源的独立属性,而 not 取决于编译器能证明或不能证明什么,或者您使用什么编译器,甚至是否存在任何编译器。
-
在 C++ 中,这是未定义的行为。 C++ 允许复制窄字符类型的不确定值(创建新的不确定值),但对于任何其他类型,左值到右值的转换(包括按值返回)会产生未定义的行为。
-
@BeeOnRope:可能还没有任何UB,但是在不触发UB的情况下不能以任何方式使用返回值。这不是发生的事情(至少在 C++ 中),但考虑它是合理的。这在其他情况下确实会发生,例如返回一个悬空引用。
标签: c language-lawyer c11