我有一个 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/