【发布时间】:2012-02-06 16:33:31
【问题描述】:
我正在刷新我对值初始化与默认初始化的理解,并遇到了this:
struct C {
int x;
int y;
C () { }
};
int main () {
C c = C ();
}
显然这是 UB 因为
在 C() 的情况下,有一个构造函数能够 初始化 x 和 y 成员,因此不会进行初始化。 因此,尝试将 C() 复制到 c 会导致未定义的行为。
我想我明白为什么,但我不确定。有人可以详细说明吗?
也就是说这也是UB?
int x; x = x;
顺便说一句,关于值初始化,以下是否保证为零?
int x = int ();
【问题讨论】:
-
不确定你的意思。如果您的意思是 x 和 y 的值将未初始化,那么是的,但是您已经回答了自己的问题(因为构造函数没有这样做)。至于C c=C();我认为这是完全正确的。
-
@Sid: 不,使用未初始化对象的值会产生未定义的行为。
-
@MikeSeymour 我认为 OP 明白这一点,但想知道语句 C c = C();本身就是UB。它在语法和语义上都是正确的。当然 x 和 y 将被初始化,因为构造函数没有做任何事情 - 所以这当然不是好的编程习惯。
-
@Sid:我不同意你关于
C c = C();有效的说法。C()成员的未初始化值用于初始化c,使用这些值会产生未定义的行为;因此它是无效的。 -
@Sid: 那么关键的观察就是如果没有发生复制省略,那么
C c = C();“使用”成员x和y创建的临时成员的未初始化值C()。所以它是UB。
标签: c++ undefined-behavior value-initialization