我有这个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
}
希望代码:)解释它