我在想如何正确地检查一个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
并不是一个指针。
为什么纯粹的if语句可以工作?其中的神奇之处是什么?这是否是检查它的正确方式?
eventFunc
不是一个 lambda 表达式,它是一个std::function
对象。你可以将 lambda 表达式存储在std::function
对象中,但它们并不完全相同。 - templatetypedef