带有 -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