1

我尝试传递一个空指针作为对 lambda 函数的引用,但它会接收一个内存地址而不是保持为空。

  function<void(json)> doTheThing(){
  ...
  pointer = nullptr;
  return [&](json object) {
    if(pointer != nullptr) {
       cout<<"pointer not null";
}
}

知道如何传递该指针以使其保持为 null 吗?

4

1 回答 1

2

[&]表示通过引用隐式捕获。

如果您通过引用捕获某些内容,那么只要它存在,它就会保持在定义的状态。您似乎正在返回一个转换为 的 lambda std::function。通过引用捕获是一个非常糟糕的主意。

局部变量超出范围。在 lambda 中捕获的对它的引用现在处于未定义状态,所有对它的使用都是未定义的行为。然后你在 a 中返回这个 lambda 的副本std::function,调用它,鼻恶魔就会射出你的鼻子;或者在您的情况下,指针不会显示为空。

永远不要在生命周期或副本生命周期超过当前范围的 lambda 中通过引用隐式捕获。

一般来说,永远不要在那种情况下隐式捕获事物,即使使用[=]. 明确。

std::function<void(json)> doTheThing() {
  void* pointer = nullptr;
  return [pointer](json object) {
    if(pointer != nullptr) {
      std::cout<<"pointer not null";
    }
  };
}
于 2017-02-17T14:02:28.847 回答