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