为什么GCC会为结构化绑定诊断一个未使用的变量,而Clang却没有?

时间:2018-04-15 18:35:43

标签: c++ gcc language-lawyer c++17 structured-bindings

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

#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

  

结构化绑定声明引入标识符列表标识符 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]视为变量,将ab分别视为名称。 我的问题然后为什么GCC会诊断b未使用的警告,因为该变量实际上是在第一个代码的return a;语句中使用的吗

1 个答案:

答案 0 :(得分:6)