【发布时间】:2018-11-15 10:53:24
【问题描述】:
在调用时将 std::function 变量从存储到该变量的函数/lambda 表达式中设置为 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);
}
}
【问题讨论】:
-
std::call_once是一个不言自明的替代方案。 -
最大的问题不是你换了
std::function,而是你当前所在的lamda被破坏了。之后你就不能再使用任何捕获的变量了。 -
这是XY problem。
-
我完全错过了
std::call_once,谢谢你的提示。 -
我投票重新打开:问题不仅在于从回调中设置函数,还在于将其设置为 nullptr 并可能删除。