带有 -Wshadow 警告的 C++ 结构化绑定?
C++ Structured binding with -Wshadow warnings?
更新:gcc 有效,但 clang 无效
使用 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
}
我已经在 godbolt 上用 gcc 9.2 和 clang 9.0.0 试过你的例子。有我的最小程序:
#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.
这是 clang 中的一个错误,如此处所报告:https://bugs.llvm.org/show_bug.cgi?id=40858。
更新:gcc 有效,但 clang 无效
使用 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
}
我已经在 godbolt 上用 gcc 9.2 和 clang 9.0.0 试过你的例子。有我的最小程序:
#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.
这是 clang 中的一个错误,如此处所报告:https://bugs.llvm.org/show_bug.cgi?id=40858。