繁体   English   中英

是否将本地范围的变量初始化为未确定的值或未初始化?

[英]Is a local scoped variable initialized to an undetermined value, or un-initialized?

迂腐地说, x在以下代码中初始化?

int main()
{
    int x;
}

8.5 Initializers [dcl.init] (对于C ++ 11)中有一些关于它的段落,但没有任何示例支持。

它正式默认初始化 ,这意味着对于int ,不执行初始化。

[dcl.init] / 12(N3797)

如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值

[dcl.init] / 7

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

  • 如果T是(可能是cv限定的)类类型,则调用T的默认构造函数[...];

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

  • 否则,不执行初始化

不,不是。 根据标准, x默认初始化的 ([dcl.init] / 6):

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

- 如果T是(可能是cv认证的)类类型[...]

- 如果T是阵列类型[...]

- 否则,不执行初始化

因此,由于不执行初始化,因此x未初始化。
因此该对象具有不确定的值([dcl.init] / 11):

如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值

而且,如果我们要访问它的存储的,不确定的值 - 换句话说,对它执行左值到右值的转换 - 我们会引起未定义的行为([conv.lval] / 1]):

如果glvalue引用的对象是[..], 或者对象未初始化,则需要此转换的程序具有未定义的行为

我理解它的方式是保留变量x的内存中的位置,但不设置为值(未初始化)。 因为它是未初始化的,所以任何旧值都将被视为'garbage'int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM