7

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

#include <utility>

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

使用 GCC 7.3 编译并传递-std=c++17and-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

结构化绑定声明将标识符列表的标识符v0、v1、v2、……作为结构化绑定的名称([basic.scope.declarative])。

所以b很明显不是一个变量,而是一个名字。使用 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]一个变量,a并且b分别作为名称。那么我的问题,考虑到变量实际上是在第一个代码的语句中使用的,为什么 GCC 会诊断出未使用的警告?breturn a;

4

1 回答 1

6

这确实是一个错误gcchttps ://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=81767并已解决:https ://gcc.gnu.org/viewcvs/gcc?view=revision&revision =248483

于 2018-04-15T18:45:16.413 回答