使用GCC 5.4/Clang 3.8编译C++结构化绑定代码报错求助
解决C++结构化绑定编译报错问题
问题根源
你碰到的编译错误,核心原因是结构化绑定(Structured Bindings) 是C++17正式纳入标准的特性,但你当前使用的编译器版本完全不支持这个特性:
- GCC 5.4.0:仅支持少量C++17草案特性,结构化绑定是从GCC 7.x版本才开始实现的,5.4版本完全没有相关支持。
- Clang 3.8.0:同理,结构化绑定的支持要等到Clang 4.0及以上版本才会提供,3.8版本还不具备这个能力。
哪怕你指定了-std=c++17(GCC)或-std=c++1z(Clang,C++17的草案阶段标识),编译器本身没有实现该特性,自然会抛出语法错误。
可行解决方案
方案1:升级编译器版本
这是最直接的解决办法,在Ubuntu 16.04上可以通过官方PPA安装更新版本的GCC或Clang:
安装新版GCC(以GCC 9为例):
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update sudo apt install gcc-9 g++-9编译时替换为新版本编译器:
g++-9 -std=c++17 test.cpp -o test安装新版Clang(以Clang 10为例):
sudo apt install clang-10编译时使用:
clang++-10 -std=c++17 test.cpp -o test
升级完成后,编译器就能正确识别并编译你的结构化绑定代码了。
方案2:改用旧编译器兼容的写法
如果暂时无法升级编译器,可以用C++11/14已支持的tuple访问方式替代结构化绑定:
#include<tuple> #include<iostream> // 可选,用于验证结果 int main(){ auto t = std::make_tuple(3.1,2.3); // 方式1:用std::get按索引访问 double c = std::get<0>(t); double d = std::get<1>(t); // 方式2:用std::tie直接绑定变量 // double c, d; // std::tie(c, d) = t; // 验证输出 std::cout << c << " " << d << std::endl; return 0; }
这段代码在你的GCC 5.4和Clang 3.8环境下,只需指定-std=c++11或更高标准就能正常编译运行。
内容的提问来源于stack exchange,提问作者Mojomoko
相关产品推荐
相关产品推荐

