C++17结构化绑定(Structured Binding)与分解声明
请说明C++17结构化绑定的语法、工作原理(编译器生成匿名变量+引用绑定),支持的数据类型(数组、元组、pair、所有公有成员的结构体),以及典型应用场景如Map遍历。
回答
苦行僧
结构化绑定:将数组、元组或结构体分解为独立命名变量。
语法:auto [a, b, c] = expression;
支持类型:
- 数组:
auto [x, y] = arr;(数量必须匹配)。 - std::tuple/pair:通过
std::tuple_size<T>和std::get<I>()分解。 - 结构体:所有非静态数据成员均为public。
工作原理:
auto [x, y] = std::make_tuple(1, 2.0);
// 等价于:
// auto __e = std::make_tuple(1, 2.0);
// auto& x = std::get<0>(__e);
// auto& y = std::get<1>(__e);
修饰符(const, &, &&)作用于匿名变量__e而非分解的变量:
auto& [x, y] = tuple;→ __e为左值引用,x/y绑定到__e的成员。const auto& [x, y] = tuple;→ 常量左值引用。
典型应用:
// Map遍历
std::map<int, std::string> m;
for (const auto& [key, value] : m) { ... }
// 从函数返回多值
auto [success, result] = tryParse(input);
陷阱:结构化绑定不能直接取地址(&x 实际上是&__e中的成员)。