标准中是否有定义从变量阴影中初始化变量的内容?
例如:
int i = 7;
{
int i = i;
}
Visual Studio 2013在没有警告的情况下允许此操作并按预期工作。内部i
变量是7. Clang和GCC然后给我一个警告,初始化变量初始化将是未初始化的。
答案 0 :(得分:9)
标准有这样的说法:
3.3.2 声明点 [basic.scope.pdecl]
1 名称的声明点紧跟在其完整的声明符之后 (第8条)及其初始化程序(如果有)之前,除非另有说明。 [例如:
int x = 12; { int x = x; }
这里第二个x被初始化 有自己的(不确定的)价值。 - 例子]
这正是你的情况。该程序通过访问未初始化的对象来展示未定义的行为。
我的VS2013副本报告error C4700: uninitialized local variable 'i' used
此代码。不确定为什么你的副本表现不同。
答案 1 :(得分:3)
如果第一个变量是在名称空间中定义的,例如在全局名称空间中,那么您可以使用其限定名称进行编写
int i = 7;
int main()
{
int i = ::i;
//...
}