ychen added a comment. In D133683#3818887 <https://reviews.llvm.org/D133683#3818887>, @mizvekov wrote:
> In D133683#3818858 <https://reviews.llvm.org/D133683#3818858>, @ychen wrote: > >> It is clear cut by https://eel.is/c++draft/temp.deduct.partial#3.1. It is >> orthogonal to the DRs implemented in D128745 >> <https://reviews.llvm.org/D128745> and here. >> https://godbolt.org/z/s49sqrabY : if you call `g(42,42)`, it would reveal >> that the function without pack indeed wins. It is ambiguous because the >> caller `g(42)` does not use the pack. So the wording prevents us from >> letting the non-pack version win. I do somewhat agree that it is more >> consistent and predictable to always consider all function parameters for >> partial ordering. Yeah, that needs a whole separate discussion on >> https://eel.is/c++draft/temp.deduct.partial#3.1. > > I think it's using the pack, the pack is just being deduced as an empty pack. > This is different from a template parameter which is not being deduced > because it does not appear in the arguments. > > To reiterate, what you said would make sense if the second overload was > written as: > > `template <typename T, typename... U> void g(T);` > > Instead of `template <typename T, typename... U> void g(T, U...);` as it is. This is described in https://eel.is/c++draft/temp.deduct.partial#13. Parietal ordering currently doesn't consider the number of deduced arguments. During the partial ordering stage, by https://eel.is/c++draft/temp.func.order#3, `template <typename T, typename... U> void g(T, U...);` would become `void g(UniqueT1, UniqueT2);`. And then it applies https://eel.is/c++draft/temp.deduct.partial#3.1 to decide which parameters are compared for partial ordering. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133683/new/ https://reviews.llvm.org/D133683 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits