如何在 lambda C++ 中模拟结构化绑定初始化捕获?

How to emulate structured binding init-capture in lambda C++?

在 lambda 中的初始化捕获列表中是否有任何等效于结构化绑定的东西?

我知道这是无效的,但是有没有什么方法可以声明 'i' 和 's' 而无需在 lambda 之外声明?

std::pair<int, std::string> p { 1, "two" };

auto f = [[i, s] = p] mutable -> std::pair<int, std::string> {
  ++i;
  s += '_';
  return {i, s};
};

auto print = [&]{ 
  const auto& x = f();
  std::cout << x.first << ": " << x.second << '\n';
};

print();
print();
print();

输出:

1: _
2: __
3: ___

没有直接执行此操作的语法。

您可以复制该对并在 lambda 内部使用结构化绑定:

auto f = [p]() mutable {
    auto& [i, s] = p;
    
    ++i;
    s += '_';
    return std::make_pair(i, s);
};

(请注意,从 C++20 开始,不允许在 mutable 前面省略 ()。)

或者,您可以直接使用 .first.second

auto f = [i = p.first, s = p.second]() mutable {
    ++i;
    s += '_';
    return std::make_pair(i, s);
};