让我们从一个最小的例子开始:
#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
分别视为名称。 我的问题然后为什么GCC会诊断b
未使用的警告,因为该变量实际上是在第一个代码的return a;
语句中使用的吗
答案 0 :(得分:6)