当lambda执行时,C++ lambda捕获的引用具有不同的值

Tha*_*gan 0 c++ c++14

我正在为一个项目构建一个pubsub系统,我有一个有趣的问题,事件值在通知和事件发送之间变化.我遇到问题的事件是一个MouseMoveEvent,其中包含使用glm :: vec2()的屏幕坐标(它有双重类型的x和y字段).

template<class E>
void notify_event(std::shared_ptr<E> event) {
  if (_auto_dispatch) {
    dispatch<E>(event);
  } else {
    // inspecting values here gives expected coordinates: 
    // like: 168.684,284.547
    debug<E>(event); 
    _dispatch_queue.push([&]() {
      // when the lambda runs, the coordinates are major messed up
      // like: -1.82767e+16,4.57398e-41
      debug<E>(event); 
      dispatch<E>(event);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

无论输入值如何,都给出-1.82767e + 16,4.57398e-41坐标.我最初使用引用传递事件,然后尝试共享指针,但我得到两个完全相同的结果.调度事件立即运行没有任何问题,但我的项目要求我收集事件,然后稍后调度,因为不同的系统将在创建事件时处于"准备好"的各种状态.

我觉得捕获的事件引用最终以某种方式指向垃圾内存,但我不太清楚C++中的lambdas,知道我为什么会看到它.

发生了什么事,有什么选择可以解决这个问题?

Som*_*ude 7

似乎lambda将在notify_event函数返回后被调用,这意味着参数event将超出范围并且引用将无效.

虽然肯定会有一些用例,应该通过引用传递(或捕获)共享指针,但这似乎不是其中之一.通过值捕获它,以便lambda将拥有自己的共享指针,该指针始终有效(即使在最后一个实例被破坏之后).