C++ C++;11声明点按值捕获的lambda捕获

C++ C++;11声明点按值捕获的lambda捕获,c++,lambda,c++11,C++,Lambda,C++11,下面的代码打印0,但我希望看到1。我的结论是,lambda函数不是通过实际将捕获的参数传递给函数来调用的,这更直观。我是对的还是我遗漏了什么 #include <iostream> int main(int argc, char **argv){ int value = 0; auto incr_value = [&value]() { value++; }; auto print_value = [ value]() { std::cout <<

下面的代码打印0,但我希望看到1。我的结论是,lambda函数不是通过实际将捕获的参数传递给函数来调用的,这更直观。我是对的还是我遗漏了什么

#include <iostream>
int main(int argc, char **argv){
  int value = 0;
  auto incr_value  = [&value]() { value++; };
  auto print_value = [ value]() { std::cout << value << std::endl; };
  incr_value();
  print_value();
  return 0;
}
#包括
int main(int argc,字符**argv){
int值=0;
自动递增值=[&value](){value++;};

auto print_value=[value](){std::coutLambda函数通过实际将捕获的参数传递给函数来调用

在定义lambda的点处等于0(并且捕获了
)。因为您是按值捕获的,所以捕获后对
执行什么操作并不重要


如果您通过引用捕获了
,那么您将看到打印的1,因为即使捕获点仍然相同(lambda定义)您将打印捕获对象的当前值,而不是捕获对象时创建的副本。

是的,捕获是在声明lambda时完成的,而不是在调用lambda时。将lambda视为函数对象,其构造函数将捕获的变量作为参数,并将其分配给相应的member变量(值或引用,取决于捕获模式)。lambda的实际调用没有魔力,它只是底层函数对象的常规
操作符()
调用

在调用点捕获东西没有多大意义-如果lambda作为参数返回或传递给另一个函数并在那里调用,会捕获什么?实际上,有一些语言确实是这样做的-如果在函数中引用变量
x
,则假定它引用任何名为
x的变量e> 当前在调用点处于作用域中。这称为动态作用域。大多数语言使用的另一种方法称为词汇作用域,因为它使程序的推理更加简单


问题在于打印函数是按值而不是按引用捕获的

#include <iostream>
int main(int argc, char **argv){
  int value = 0;
  auto incr_value  = [&value]() { value++; };
  auto print_value = [ value]() { std::cout << value << std::endl; };
  auto print_valueref = [ &value]() { std::cout << value << std::endl; };

  incr_value();
  print_value();
  print_valueref();
  return 0;
}
#包括
int main(int argc,字符**argv){
int值=0;
自动递增值=[&value](){value++;};

auto print_value=[value](){std::cout谢谢。我一直认为在函数外部看不到值更新中的按值更新。但是,听起来这也意味着函数内部看不到函数外部的更新。这里可能有误导性的说法:按值表示“生成副本”。lambda有一个变量的副本,它的值是在lambda声明点获取的。由于lambda有一个私有副本,原始对象不会在lambda中被修改或读取。这就是为什么实际上存在一个引用捕获,以允许您查看/修改原始对象。