如何在 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);
};
在 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);
};