为什么gcc抱怨"声明' foo'隐藏前一个电话[-Werror = shadow]"

时间:2018-04-16 21:08:38

标签: c++ gcc

我有这个MCVE:

auto bar() -> double { return 8.0; }

int main()
{
    if ( auto foo = bar() )
    {
        return foo;
    }
    else if ( auto foo = bar() )
    {
        return foo;
    }
}

使用gcc 7.3进行编译,这些选项-c -Werror -Wextra -Wall -Wshadow会生成以下错误消息:

test-shadow.cpp: In function ‘int main()’:
test-shadow.cpp:9:17: error: declaration of ‘foo’ shadows a previous local [-Werror=shadow]
  else if ( auto foo = bar() )
                 ^~~
test-shadow.cpp:5:12: note: shadowed declaration is here
  if ( auto foo = bar() )

我不明白为什么第二个foo 遮蔽第一个定义。

我的问题:

为什么gcc会产生此错误?在我看来,第一个foo定义的范围仅在if块内有效,因此第二个定义不是阴影第一个。

1 个答案:

答案 0 :(得分:13)

基本上是这样的:

auto bar() -> double { return 8.0; }

int main()
{
    { // start of if scope
        auto foo = bar();
        if (foo)
        {
            return foo;
        }
        else
        {
            auto foo = bar(); // this foo shadows previous foo
            if (foo)
            {
                return foo;
            }
        }
    } // end of if scope
}

希望代码解释它:)