在 Lambda 表达式中将引用捕获为值

Capturing reference as value in Lambda expressions

提问人:rstr1112 提问时间:9/27/2022 更新时间:9/27/2022 访问量:54

问:

int TestMethod(const std::map<std::string, std::string>& map)
{

  auto m1 = [map=map]()
  {
    // is map here captured as reference or value ?
    std::cout << map.at("test") << std::endl;
    return 1;
  };
  
  return m1();
}

里面,是作为价值还是作为参考? PS 这只是一个简单的例子,m1 在另一个线程上被调用有时会抛出一个m1map

异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常代码:
0x0000000000000001、0x0000000000000010

编译器是 C++17 ,在 MAC 上叮叮当当。

C++ C++17 按引用 值传递

评论

0赞 jjramsey 9/27/2022
CppReference 来看,您似乎正在创建一个名为的变量,该变量由值 初始化。不确定这是否可行。你可能只是想要,而不是。mapmap[map][map=map]
0赞 Remy Lebeau 9/27/2022
"地图是作为值捕获还是作为参考?- 确定这一点的一个简单方法是查看 lambda 外部的内存地址与 lambda 内部的内存地址。如果它们不同,则按值捕获。如果它们相同,则通过引用进行捕获。mapmap
2赞 Nicol Bolas 9/27/2022
如果捕获中没有,则它是一个值。这是一个非常简单的规则(只需忽略 )的行为。&this

答:

0赞 Enlico 9/27/2022 #1

这是通过复制捕获的。 将是引用捕获。[&map=map]