让我们从一个最小的例子开始:
#include <utility>
int main()
{
auto [a, b] = std::pair(1, 'A');
return a;
}
使用 GCC 7.3 编译并传递-std=c++17
and-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 会诊断出未使用的警告?b
return a;