编译错误:GCC-5 不支持结构化绑定
为什么?
/home/jan/pstack/dwarf_frame.cc: In member function 'pstack::Elf::Off pstack::Dwarf::CFI::decodeCIEFDEHdr(pstack::Dwarf::DWARFReader&, pstack::Dwarf::FIType, pstack::Elf::Off*) const':
/home/jan/pstack/dwarf_frame.cc:74:10: error: expected unqualified-id before '[' token
auto [ length, addrLen ] = r.getlength();
检查编译器版本:
$ $CXX --version
arm-poky-linux-gnueabi-g++ (GCC) 5.3.0
结构化绑定是 C++17 的特性,GCC-5 对 C++17 的支持不完整,不支持结构化绑定。需要 GCC-7 以上版本。
怎么办?用 std::tie
考虑到 getlength() 的定义如下:
std::pair<Elf::Off, Elf::Off> DWARFReader::getlength() {
size_t length = getu32();
...
return { length, 4 };
}
在 C++11 中,可以使用 std::tie 来解包返回的 std::pair,与结构化绑定功能相同:
Elf::Off length, addrLen;
std::tie(length, addrLen) = r.getlength();
在 GCC-5 上编译成功,使用 std::tie 从 std::pair 或 std::tuple 中提取值是结构化绑定的简单有效的替代方案