I was wondering how to properly check if an std::function
is empty. Consider this example:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
This code compiles just fine in MSVC but if I call doSomething()
without initializing the eventFunc
the code obviously crashes. That's expected but I was wondering what is the value of the eventFunc
? The debugger says 'empty'
. So I fixed that using simple if statement:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
This works but I am still wondering what is the value of non-initialized std::function
? I would like to write if (eventFunc != nullptr)
but std::function
is (obviously) not a pointer.
Why the pure if works? What's the magic behind it? And, is it the correct way how to check it?
Check here http://www.cplusplus.com/reference/functional/function/operator_bool/
Example
Output
You're not checking for an empty lambda, but whether the
std::function
has a callable target stored in it. The check is well-defined and works because ofstd::function::operator bool
which allows for implicit conversion tobool
in contexts where boolean values are required (such as the conditional expression in anif
statement).Besides, the notion of an empty lambda doesn't really make sense. Behind the scenes the compiler converts a lambda expression into a
struct
(orclass
) definition, with the variables you capture stored as data members of thisstruct
. A public function call operator is also defined, which is what allows you to invoke the lambda. So what would an empty lambda be?You can also write
if(eventFunc != nullptr)
if you wish to, it's equivalent to the code you have in the question.std::function
definesoperator==
andoperator!=
overloads for comparing with anullptr_t
.