c++ - 如何给 lambda 一个持续时间与 lambda 一样长的内部值?

标签 c++ c++11 lambda c++14

我想要一个可以在 lambda 内部修改而不影响封闭范围的变量。行为像这样的东西:

std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
{
  auto sum = 0;
  std::for_each(vec.begin(), vec.end(), [sum](int value) mutable
  {
    sum += value;
    std::cout << "Sum is up to: " << sum << '/n';
  });
}

但是,我希望能够在不在 lambda 外部声明 sum 变量的情况下执行此操作。像这样:

std::vector vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

std::for_each(vec.begin(), vec.end(), [auto sum = 0](int value) mutable
{
  sum += value;
  std::cout << "Sum is up to: " << sum << '/n';
});

所以 sum 只在 lambda 内部可见,在封闭范围内不可见。在 C++11/14 中是否可行?

最佳答案

C++14 引入了广义 Lambda 捕获,让您可以随心所欲。

捕获将从 init 表达式的类型推导出来,就好像通过 auto 一样。

[sum = 0] (int value) mutable {
    // 'sum' has been deduced to 'int' and initialized to '0' here.
    /* ... */
}

关于c++ - 如何给 lambda 一个持续时间与 lambda 一样长的内部值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595689/

相关文章:

c++ - C++14 会支持不受约束的泛型函数吗?

c++ - 警告 : non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]

lambda - Java 8 Stream 每 100 行读取一次文件

c# - 使用 Linq 将 List<string> 转换为 List<KeyValuePair<string, string>>

c# - Lambdas 和异常处理

c++ - 注册后如何设置窗口的背景颜色?

c++ - 重载数组访问运算符时如何访问 SIMD vector 元素?

c++ - ROS AsyncSpinner 的多线程行为

c++ - 为什么std::fetch_add返回旧值?

unit-testing - 在 C++ 中使用 gmock 模拟具体类