C++ 初始化具有不确定值的对象

C++ 初始化具有不确定值的对象,c++,initialization,undefined-behavior,C++,Initialization,Undefined Behavior,以下是否调用未定义的行为 int x; int i = x; 来自C++03的参考 (4.1/1)如果左值所指的对象不是T类型的对象 并且不是从T派生的类型的对象,或者如果对象是 未初始化,需要此转换的程序已 未定义的行为 编辑: 然而,从(3.3.1/1)开始,一个对象可以用它自己的不确定值初始化,为什么?i、 e int x = x; //not an undefined behaviour 它调用完全定义的行为。无论在堆栈上分配垃圾值x时它是什么,都将按原样分配给i 但是,根据编译器的

以下是否调用未定义的行为

int x;
int i = x;
来自C++03的参考

(4.1/1)如果左值所指的对象不是T类型的对象 并且不是从T派生的类型的对象,或者如果对象是 未初始化,需要此转换的程序已 未定义的行为

编辑: 然而,从(3.3.1/1)开始,一个对象可以用它自己的不确定值初始化,为什么?i、 e

int x = x; //not an undefined behaviour

它调用完全定义的行为。无论在堆栈上分配垃圾值x时它是什么,都将按原样分配给i


但是,根据编译器的不同,您可能会收到有关引用未初始化变量的编译时警告。

是的,因为您正在读取未初始化和未分配的变量(
x
)的值。

如果
x
未初始化,则它是未定义的,如您在引用中所述

int x; // 0 initialized
int i = x;

int main() {
  int z; // not initialized
  int k = z; // UB
}

唯一要记住的是这没关系:

static int x;
int j = x;
但你的例子并非如此

int x=x//不是一种未定义的行为


错误。

否,访问未初始化和未赋值变量的值是UB。@Dennis yes,或者编译器可能会崩溃,或者它可能会点比萨饼,或者其他任何事情都可能发生。猜测是毫无意义的,因为标准将其定义为未定义的。这甚至意味着编译器可以让恶魔飞出你的鼻子。更现实地说,编译器可能会进行一次“优化”狂暴,即假定它想要的
i
x
的值是什么,这当然会导致产生与您期望的不同的代码(我记得看到一个问题,GCC将
if(uninitializedBool)stmt;
转化为无条件的
stmt;
)。我希望我的编译器订购比萨饼并支付费用。@SethCarnegie当您找到订购比萨饼的编译器时,如果您访问未初始化变量的值,请将其转发给我。我认为这取决于您使用的编译器。但对程序员来说,这主要是一种未定义的行为。通常,你会在
x
i
@frarees上得到垃圾,这取决于编译器“否。有些东西要么有定义的行为,要么没有。我刚才说了,因为我听说一些编译器在定义
x
时假设值为0,并且没有赋值。此外,在本例中,当我谈论行为时,我引用它最终得到的值。@frarees,但某些编译器所做的与定义的行为无关。编译器编写者可以做出未记录的技术选择并在以后进行更改。@user1086635我不确定您所指的是标准的哪一部分,因为3.3.1是关于作用域的,我不知道/1是什么意思。@user1086635哦,我想我是在看3.1.1。我不确定,我猜他们只是用它来表示名称不是指外部的
x
,而是指刚刚声明的
x
(即,即使在到达
=
之前,名称也会立即隐藏外部的
x
)。我不认为他们说这是有效的。事实上,我不确定它是否是UB,因为他们只是把它作为一个例子,什么也没说。“0为内置类型初始化”拥抱?他们在标准中把它作为一个例子。我想这并不意味着他们说没问题。事实上。我不喜欢提到一些代码,并且不清楚地说这是不允许的代码。。。你可以联系C++委员会。