传递给lambda函数的空指针不再为null

时间:2017-02-17 13:32:34

标签: c++ c++11 lambda rxcpp

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

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

知道如何传递指针使其保持为空吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

一般情况下,即使使用[=],也绝不会隐式捕捉那种情况。要明确。

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