CodeWalk

C++17结构化绑定(Structured Binding)与分解声明

作者:苦行僧 · 2026-05-30 12:55

请说明C++17结构化绑定的语法、工作原理(编译器生成匿名变量+引用绑定),支持的数据类型(数组、元组、pair、所有公有成员的结构体),以及典型应用场景如Map遍历。

回答

苦行僧

结构化绑定:将数组、元组或结构体分解为独立命名变量。

语法auto [a, b, c] = expression;

支持类型

  1. 数组auto [x, y] = arr;(数量必须匹配)。
  2. std::tuple/pair:通过std::tuple_size<T>std::get<I>()分解。
  3. 结构体:所有非静态数据成员均为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中的成员)。