Lambda表达式的捕获列表里的&具体是声明意思呢?

先贴代码:

int main(void)
{
  std::set<std::string> teas{"black", "green"};
  auto myFunc = [&teas](){ return *(teas.begin()); };
  std::cout << myFunc() << std::endl;
  return 0;
}

运行程序得到black
但如果将Lambda表达式中的捕获列表中的“&teas”改为“teas”,运行程序也得到black
那这个&究竟是什么呢?有什么作用呢?
查了下资料,感觉像是引用,但引用有什么意义呢?
求佬指点

这是闭包,为了直接引用外部的变量,避免复制造成性能浪费

&直接引用外部变量的地址,否则会生成一个值和名称相同但地址不同的举报变量

【以下回答由 GPT 生成】

问题回答:

在Lambda表达式的捕获列表中,"&"符号表示引用捕获,它的作用是允许Lambda表达式访问外部变量,并且可以修改它们的值。

在你提供的代码示例中,"&teas"表示将std::set类型的变量teas以引用方式捕获到Lambda表达式中。因此,在Lambda表达式中可以通过引用访问和修改teas的值。

为了更好的理解,我们可以看一个简化的示例代码:

#include <iostream>

int main() {
  int num = 10;
  auto myFunc = [&num]() { // 使用引用捕获
    num = 20; // 修改num的值
    std::cout << "Inside Lambda: " << num << std::endl;
  };

  myFunc(); // 输出 "Inside Lambda: 20"
  std::cout << "Outside Lambda: " << num << std::endl; // 输出 "Outside Lambda: 20"

  return 0;
}

在上述代码中,对变量num使用引用捕获后,Lambda表达式内部可以修改num的值,并且这个修改也会影响到Lambda表达式外部对num的访问。

请注意,如果在Lambda表达式中使用普通的值捕获(即不使用引用捕获),则无法修改外部变量的值。

对于你提到的将捕获列表中的 "&teas" 改为 "teas" 仍然能够得到相同的输出 "black" 的问题,是因为在这种情况下,被捕获的变量会被复制一份到Lambda表达式中,而不是以引用方式访问。因此,对teas的修改不会反映到原始变量中,但是原始变量在Lambda表达式创建时的值会被使用。

希望以上解答对你有帮助,如还有其他问题,请随时追问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^