为何GCC诊断结构化绑定存在未使用变量而Clang无此提示?
GCC结构化绑定未使用元素的警告表述问题
这确实是GCC在警告信息用词上的一个小疏漏,咱们先看最小复现代码:
#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没有被使用,但这里的表述有误:它把b称为"变量",可根据C++标准,结构化绑定里的这些标识符根本不是变量。
咱们看看C++标准[dcl.struct.bind]/1的定义:
结构化绑定声明是一种声明,它引入了一组标识符,这些标识符被绑定到初始化器的子对象或元素上。
换句话说,b只是一个绑定到std::pair对象第二个元素的名字,并非独立的变量。GCC这里的警告信息用词不够精准,应该用更贴合标准的表述,比如"structured binding"或者直接说明是绑定的元素。
内容的提问来源于stack exchange,提问作者Mário Feroldi
相关产品推荐
相关产品推荐

