c++ - 在执行期间重新分配 std::function 对象

标签 c++ c++11 lambda std-function

我有一个 std::function 对象,用作某些事件的回调。我将一个 lambda 分配给该对象,在其中,我将该对象分配给另一个执行中的 lambda。当我这样做时,我遇到了段错误。这不是我被允许做的事吗?如果是这样,为什么?我将如何实现这一目标?

声明:

std::function<void(Data *)> doCallback;

调用:

//
// This gets called after a sendDataRequest call returns with data
//
void onIncomingData(Data *data)
{
    if ( doCallback )
    {
        doCallback(data);
    }
}

作业:

doCallback =
    [=](Data *data)
    {
        //
        // Change the callback within itself because we want to do 
        // something else after getting one request  
        //
        doCallback =
            [=](Data *data2)
            {
                ... do some work ...
            };
        sendDataRequest();
    };
sendDataRequest();

最佳答案

标准没有指定在 std::function::operator() 操作中函数何时使用其内部状态对象。在实践中,一些实现在调用后使用它。

所以你所做的是未定义的行为,特别是它崩溃了。

struct bob {
  std::function<void()> task;
  std::function<void()> next_task;
  void operator()(){
    next_task=task;
    task();
    task=std::move(next_task);
  }
}

现在,如果您想更改下次在 bob() 中调用 bob 时发生的情况,只需设置 next_task 即可。

关于c++ - 在执行期间重新分配 std::function 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23357236/

相关文章:

C++检查xs :double datatype

c++ - return 语句中的三元运算符

c++ - Const 右值编译器区别

c++ - 从调用的可调用目标将 std::function 设置为 nullptr

java - 为什么我不能在 Java 8 lambda 表达式中抛出异常?

Java 8 : Difference between method reference Bound Receiver and UnBound Receiver

c++ - 我怎样才能让一个类函数接受另一个对象? (C++)

c++ - 无法打开输出文件 debug\serbest.exe : Permission denied

c++ - 在 C 代码中使用 C++ 库

c++ - constexpr 参数化函数指针