代码之家  ›  专栏  ›  技术社区  ›  Peter VARGA

为什么gcc抱怨“声明‘foo’隐藏了以前的调用[-Werror=shadow]”

  •  6
  • Peter VARGA  · 技术社区  · 7 年前

    我有这个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 回复  |  直到 7 年前
        1
  •  12
  •   fisheye    7 年前

    基本上是这样的:

    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
    }
    

    希望代码能解释:)