https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88907
Bug ID: 88907 Summary: Variadic template function deduction failure. Product: gcc Version: 8.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: Peter.Georg at physik dot uni-regensburg.de Target Milestone: --- Created attachment 45462 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45462&action=edit Code to reproduce bug including possible work-arounds GCC fails to compile the following code due to alleged ambiguous function call. ``` #include <utility> template<class T, int... Ns> class Base { }; template<class... Ts, int... Ns> void error(Base<Ts, Ns...> const &... args) { } template<class... Ts, class = std::enable_if_t< std::conjunction<std::is_class<std::remove_reference_t<Ts>>...>{}>> void error(Ts &&... args) { } int main() { Base<int, 4, 4> const a; error(a); } ``` The code is also attached or see: https://godbolt.org/z/GuW-YC I.e. call to error(Base<int, 4, 4> const &) is ambiguous for GCC. In my opinion, and e.g. clang agrees with me, the first function is clearly more specialized and thus should be chosen. There are two possible work-arounds (both are included in the attached code): #1: Add an extra function error that takes exactly one parameter of Type Base<T, Ns...> const & #2: Remove the default template parameter (SFINAE) from the second error function I started I discussion about this (I wasn't sure it is a bug at first) and a related clang bug (https://bugs.llvm.org/show_bug.cgi?id=40305) here: https://stackoverflow.com/questions/54236545/why-is-it-an-ambigious-function-call-using-gcc-template-deduction-failing