Проблема в том, что типы не совпадают.
void(*run)() = [this]() { handleInput(); update(); draw(); }; }
Вы назначаете лямбду на указатель функции. Лямбда не является указателем на функцию и фактически является экземпляром класса, который переопределяет operator()
. Этот объект также фиксирует это в вашем example
.
void(*setup)() = [](){};
Компилируется, потому что нет захвата. Когда нет захвата, нет никакого состояния, и лямбда может рассматриваться как указатель, а не как экземпляр класса.
Если бы это было разрешено языком, вы бы хотели что-то вроде
// error
auto run = [this]() { handleInput(); update(); draw(); };·
Но этот синтаксис не поддерживается в этом контексте. А поскольку тип лямбда-объекта неизвестен программисту, нет возможности записать его тип.
Вместо этого будет работать что-то вроде:
std::function<void()>run = [this]() { handleInput(); update(); draw(); };
Это не так эффективно, как определение run
с типом лямбды, поскольку std::function
, скорее всего, будет хранить лямбда в куче.