更新:海湾合作委员会的作品,但c不
用C ++ 17编译
如果发生阴影局部变量,则GCC / Clang -Wshadow将发出警告,但是对于结构化绑定,此标志不起作用。在这种情况下如何暴露警告?
std::tuple<int, int> yy = {-1, -2};
int x = 1;
{
// int x = 2; // will warn -Wshadow
auto [x, y] = yy; // will not warn even if compile with -weverything
}
最佳答案
我已经在gcc 9.2和clang 9.0.0的godbolt上尝试了您的示例。有我的最小程序:
#include <tuple>
std::tuple<int, int> yy = {-1, -2};
void bla(int x)
{
if (x)
{
auto [x, y] = yy;
}
}
在gcc(
-Wall -Wshadow -std=c++17
)中获取阴影警告:<source>: In function 'void bla(int)':
<source>:8:19: warning: declaration of 'auto x' shadows a parameter [-Wshadow]
8 | auto [x, y] = yy;
| ^
<source>:4:14: note: shadowed declaration is here
4 | void bla(int x)
| ~~~~^
<source>:8:14: warning: structured binding declaration set but not used [-Wunused-but-set-variable]
8 | auto [x, y] = yy;
| ^~~~~~
但不是用clang(
-Wall -Wshadow -Wshadow-all -std=c++17
):<source>:8:14: warning: unused variable '[x, y]' [-Wunused-variable]
auto [x, y] = yy;
^
1 warning generated.
我猜这是一个叮叮当当的问题。
关于c++ - 带有-Wshadow警告的C++结构化绑定(bind)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58056621/