我有这个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
块内有效,因此第二个定义不是阴影第一个。
答案 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
}
希望代码解释它:)