为什么 GCC 会为结构化绑定诊断未使用的变量而 Clang 不会?

Why does GCC diagnose a unused variable for structured bindings while Clang doesn't?

让我们从一个最小的例子开始:

#include <utility>

int main()
{
    auto [a, b] = std::pair(1, 'A');
    return a;
}

使用 GCC 7.3 编译通过 -std=c++17-Wunused-variable,并且 运行 它:

<source>: In function 'int main()':
<source>:5:15: warning: unused variable 'b' [-Wunused-variable]
     auto [a, b] = std::pair(1, 'A');
               ^

GCC 可能正确地报告了 b 的缺失使用,但它错误地将其称为变量。引用 [dcl.struct.bind]/1:

A structured binding declaration introduces the identifiers v0, v1, v2, … of the identifier-list as names ([basic.scope.declarative]) of structured bindings.

所以 b 显然不是一个变量,而是一个 name。使用 Clang 6.0.0 和相同的标志编译相同的代码,我们不会收到任何警告。从代码中删除 return a; 语句:

#include <utility>

int main()
{
    auto [a, b] = std::pair(1, 'A');
    // return a;
}

并用 Clang 再次编译,我们得到:

<source>:5:10: warning: unused variable '[a, b]' [-Wunused-variable]
    auto [a, b] = std::pair(1, 'A');
         ^

根据我的解释,正确地将 [a, b] 视为变量,而将 ab 分别视为名称。 我的问题然后是 为什么 GCC 会诊断出 b 未使用的警告,考虑到该变量实际上正在 return a; 中使用第一个代码的语句?

这确实是 gcc 中的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=81767 and was solved in: https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=248483