c lambda 按值捕获

新手上路,请多包涵

我正在阅读 本书 第 3 章中的 C++ lambda 部分,下面的代码让我感到困惑:

 int x = 0;
int y = 42;
auto qqq = [x, &y] {
    std::cout << "x: " << x << std::endl;
    std::cout << "y: " << y << std::endl;
    ++y;
};
x = y = 77;
qqq();
qqq();
std::cout << "final y: " << y << std::endl;

这段代码打印出来:

 x: 0
y: 77
x: 0
y: 78
final y: 79

为什么 qqq() 没有记录 x 已变为 77?有人指出,按值传递意味着我们可以读取但不能修改定义 lambda 的可读数据。这是否意味着我们在定义后看不到变化?

原文由 Lawrence 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 331
1 个回答

这是因为当您定义 lambda 时,该变量仅被值捕获(即复制)一次。它不是您可能认为的“更新”。代码大致相当于:

 #include <iostream>

int x = 0;
struct Lambda
{
    int _internal_x; // this is used to "capture" x ONLY ONCE
    Lambda(): _internal_x(x) {} // we "capture" it at construction, no updates after
    void operator()() const
    {
        std::cout << _internal_x << std::endl;
    }
} qqq;

int main()
{
    qqq();
    x = 77; // this has no effect on the internal state of the lambda
    qqq();
}

住在科利鲁

原文由 vsoftco 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题