[英]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.