Мне было интересно, как правильно проверить 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
это (очевидно) не указатель.
Почему чистый, если работает? Что за магия стоит за этим? И правильно ли это проверить?
eventFunc
это не лямбда; этоstd::function
. Вы можете хранить лямбды вstd::function
s, но это не одно и то же.