让我们从一个最简单的例子开始:
#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]
视为一个变量,而将 a
和 b
分别视为名称的程序。那么,我的问题是,既然第一个代码中的 return a;
语句确实使用了变量,为什么GCC会诊断出 b
未使用的警告?
b
是一个变量。但通常情况下,b
可能是任何东西,包括lambda或指向函数的指针。 - Clearer