clangd is fully open source. You can build it yourself from llvm sources.
It works fine with emacs LSP support. I never used the proprietary extension so I can't compare the functionality, stability nor speed.
Overloading does not conflict with type inference: it just means that type annotations are sometimes necessary to get down to concrete types for execution. From "f(x)" we can infer that the type of x is one of f's overloaded argument types.
[interop]
appendWindowsPath=false
section in /etc/wsl.conf.
Then everything will go flawlessly.