为什么 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]
视为变量,而将 a
和 b
分别视为名称。 我的问题然后是 为什么 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
让我们从一个最小的例子开始:
#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]
视为变量,而将 a
和 b
分别视为名称。 我的问题然后是 为什么 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