更新:海湾合作委员会的作品,但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/

10-09 03:25