Мне было интересно, как правильно проверить 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::functions, но это не одно и то же.