如何在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
。