Мне было интересно, как правильно проверить, является ли 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 (очевидно) не является указателем.
Почему чистый, если работает? Какая магия позади? И, правильно ли это проверить?