将已调用的可调用目标中的std :: function设置为nullptr

时间:2018-11-15 10:53:24

标签: c++ c++11

从调用该变量时存储的函数/ lambda表达式中将std :: function变量设置为nullptr是否合法C ++(这意味着没有未定义的行为等)?

我的意图是省略对std :: function的调用。

#include <functional>

std::function<void(int)> func;

void setFunc(std::function<void(int)> f) {
    func = f;
}

int main() {
    setFunc([](int status) {
        // do something...
        setFunc(nullptr); // callback shall only be called once
    });

    for(;;) {
        int status = 0;

        // fetch status

        if (func)
            func(status);
    }
}

2 个答案:

答案 0 :(得分:0)

您的问题是另一个有趣的转折,即:

Is delete this allowed?

重要的是要谨慎避免事后使用lambda状态。
您的lambda是无状态的?这很简单。

但是无论如何,您确定您的实际设计没有其他更清洁的选择吗?例如,std::call_once()在这个过于简化的示例中会更加明显。

答案 1 :(得分:0)

您还可以使用空的初始化列表将std::function<void(int)>对象设置为默认构造的对象:

setFunc({});

为避免在调用函数对象时分配给它,您可能希望对其进行复制并调用该副本。