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

我想知道如何正确检查一个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的价值? debugging器说'empty' 。 所以我解决了这个简单的if语句:

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

这工作,但我仍然想知道什么是非初始化的std::function ? 我想写if (eventFunc != nullptr)std::function (显然)不是一个指针。

为什么纯粹的作品? 它背后的魔法是什么? 而且,如何检查它是正确的方法?

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

此外,一个空lambda的概念并没有什么意义。 在幕后,编译器将lambdaexpression式转换为struct (或class )定义,并将捕获的variables存储为此struct数据成员。 一个公共函数调用操作符也被定义了,这就是允许你调用lambda的方法。 那么空的lambda是什么?


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

点击这里查看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; } **OUT:** foo is not callable. bar is callable