为什么gcc抱怨"'foo'的声明影响了之前的调用[-Werror = shadow]"

Al *_*ndy 8 c++ gcc

我有这个MCVE:

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

int main()
{
    if ( auto foo = bar() )
    {
        return foo;
    }
    else if ( auto foo = bar() )
    {
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用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() )
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

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

小智 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
}
Run Code Online (Sandbox Code Playgroud)

希望代码解释一下:)