POD的默认初始化难以理解

时间:2016-05-24 02:11:34

标签: c++ initialization default

我在这里阅读了很多,并且在cppreference中自动POD类型没有默认初始化,但我尝试测试一些代码,我有一些奇怪的结果。看:

#include <iostream>

int main( ) {
    int x;
    std::cout << "x: " << x << std::endl;
    return 0;
}

它将输出 x 一些随机值。但是,如果我像这样修改我的代码:

#include <iostream>

void f( ) { 
    int i;
    std::cout << "i: " << i << std::endl;
}

int main( ) {
    f( );
    int x;
    std::cout << "x: " << x << std::endl;   
    return 0;
}

我将得到以下输出:

i: 0
x: 4200814

如果我在声明x及其输出后修改函数调用f( );的顺序,则 x i 都将设置为a随机值。另一件事:如果在声明x及其输出之后声明另一个没有初始化的变量,如int y;,y也会输出0。

那么,为什么变量 i 以及可能在函数 f 中声明的所有其他变量被'初始化'为0.可能是欠定义行为或不确定值的结果?< / p>

1 个答案:

答案 0 :(得分:1)

  

我在这里阅读了很多内容,并在cppreference中自动POD类型未默认初始化,

这是不正确的。未明确初始化对象时,将默认初始化该对象。根据类型默认初始化更改意味着什么。

来自C ++ 11标准:

  

8.5初始化程序

     

...

     

6要默认初始化T类型的对象意味着:

     

- 如果T是(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(如果T,则初始化不正确没有可访问的默认构造函数);

     

- 如果T是数组类型,则每个元素都是默认初始化的;

     

- 否则,不执行初始化。

因此,不会对xi执行初始化。

  

可能是行为不明确或价值不确定的结果?

是。使用未初始化变量的值是未定义行为的原因。

ix的值可以是任何值。不要依赖任何特定的模式。 重新编译时,当您更改编译器选项时,更改编译器时,它们的值很可能会发生变化。