如何在C ++ 11中正确检查std :: function是否为空?

问题描述 投票:82回答:2

我想知道如何正确检查std::function是否为空。考虑这个例子:

class Test {
    std::function<void(int a)> eventFunc;

    void registerEvent(std::function<void(int a)> e) {
        eventFunc = e;
    }

    void doSomething() {
        ...
        eventFunc(42);
    }
};

这段代码在MSVC中编译得很好,但如果我在没有初始化doSomething()的情况下调用eventFunc,代码显然会崩溃。这是预期但我想知道eventFunc的价值是多少?调试器说'empty'。所以我使用简单的if语句修复了它:

   void doSomething() {
        ...
        if (eventFunc) {
            eventFunc(42);
        }
   }

这有效,但我仍然想知道未初始化的std::function的价值是多少?我想写if (eventFunc != nullptr),但std::function(显然)不是指针。

为什么纯净如果有效?它背后的魔力是什么?而且,这是检查它的正确方法吗?

c++ c++11 std-function
2个回答
89
投票

你没有检查一个空的lambda,但std::function是否有一个可调用的目标存储在其中。检查是明确定义的,因为std::function::operator bool允许在需要布尔值的上下文中隐式转换为bool(例如if语句中的条件表达式)。

此外,空lambda的概念并不真正有意义。在幕后,编译器将lambda表达式转换为struct(或class)定义,您捕获的变量存储为此struct的数据成员。还定义了一个公共函数调用操作符,它允许您调用lambda。那么一个空的lambda会是什么?


如果你愿意,你也可以写if(eventFunc != nullptr),这相当于你在问题中的代码。 std::function defines operator==operator!=超载用于与nullptr_t进行比较。


19
投票

点击这里http://www.cplusplus.com/reference/functional/function/operator_bool/

// function::operator bool example
#include <iostream>     // std::cout
#include <functional>   // std::function, std::plus

int main () {
  std::function<int(int,int)> foo,bar;
  foo = std::plus<int>();

  foo.swap(bar);

  std::cout << "foo is " << (foo ? "callable" : "not callable") << ".\n";
  std::cout << "bar is " << (bar ? "callable" : "not callable") << ".\n";

  return 0;
}

产量

foo不可调用。

酒吧是可以赎回的。

© www.soinside.com 2019 - 2024. All rights reserved.