初始化阴影变量

时间:2014-08-29 21:26:23

标签: c++ language-lawyer

标准中是否有定义从变量阴影中初始化变量的内容?

例如:

int i = 7;
{
    int i = i;
}

Visual Studio 2013在没有警告的情况下允许此操作并按预期工作。内部i变量是7. Clang和GCC然后给我一个警告,初始化变量初始化将是未初始化的。

2 个答案:

答案 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;
   //...
}