https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113854
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Anybody who promised concepts will always result in better errors was lying or misinformed. They have the potential to help, but it takes real effort to make it happen. ranges::find_if is constrained to require the function to be callable with those argument types, and that fails here. I'm not sure how we can do better. If is_invocable is false, all we know is it's false. We can't poke at the definition of is_invocable to see why. A __builtin_is_invocable could _maybe_ capture more detail about the failure which could then be recalled and displayed if there's a compilation failure due to is_invocable not being satisfied (something which would be much more difficult for enable_if-based constraints, but plausible with concepts, maybe). I'm this specific case it's true that the error for std::find_if happens to be quite clear, but I'm the general case it's better to be told "this function requires is_invocable_v<F, A> and you didn't satisfy that" then to get errors deep inside an instantiation stack.