为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"



我有这个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块内有效,因此第二个定义不会遮蔽第一个定义。

基本上是这样的:

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
}

希望代码:)解释它

最新更新