【问题标题】:Setting std::function to nullptr from invoked callable target [duplicate]从调用的可调用目标将 std::function 设置为 nullptr [重复]
【发布时间】: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 并可能删除。

标签: c++ c++11


【解决方案1】:

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

Is delete this allowed?

重要的部分是小心避免之后使用 lambda 的状态。
你的 lambda 是无状态的?这样就很简单了。

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

【讨论】:

    【解决方案2】:

    您还可以使用空的初始值设定项列表将std::function&lt;void(int)&gt; 对象设置为默认构造的对象:

    setFunc({});
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多