提问人:Luchian Grigore 提问时间:9/23/2014 更新时间:9/24/2014 访问量:103
局部作用域变量是初始化为未确定的值,还是未初始化?
Is a local scoped variable initialized to an undetermined value, or un-initialized?
问:
迂腐地说,是否在下面的代码中初始化?x
int main()
{
int x;
}
在 8.5 初始化器 [dcl.init](用于 C++11)中有一些关于它的段落,但没有任何示例支持。
答:
它是正式默认初始化的,这意味着对于 s,不执行任何初始化。int
[dcl.init]/12 (N3797)
如果未为对象指定初始值设定项,则该对象将默认初始化;如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值
[dcl.init]/7
默认初始化类型的对象意味着:
T
if 是(可能是 CV 限定的)类类型,默认值 构造函数称为 [...];
T
T
如果是数组类型,则每个元素都是默认初始化的;
T
否则,不执行初始化。
评论
不,不是。根据标准,默认初始化 ([dcl.init]/6):x
默认初始化 T 类型的对象意味着:
— 如果是(可能是 CV 合格的)类类型 [...]
T
— if 是数组类型 [...]
T
— 否则,不执行任何初始化。
x
因此,由于未执行初始化,因此未初始化。
因此,该对象具有不确定的值 ([dcl.init]/11):
如果未为对象指定初始值设定项,则该对象为 默认初始化;如果未执行初始化,则对象 具有自动或动态存储持续时间的不确定值。
此外,如果我们要访问它存储的不确定值 - 换句话说,对它执行左值到右值的转换 - 我们将诱发未定义的行为 ([conv.lval]/1]):
如果 glvalue 所指的对象是 [..],或者如果 未初始化,则需要此转换的程序具有 未定义的行为。
我的理解是,变量 x 在内存中的位置是保留的,但未设置为值(未初始化)。因为它是未初始化的,所以那里的任何旧值都将被视为 'garbage' int。
评论
int