vendredi 2 septembre 2016

gcc vs. clang, msvc and icc: Is this function call ambiguous?

All compilers I could get my hands on agree that this is fine:

template <typename Check, typename... T>
auto foo(Check, T...) -> void;

template <typename... T>
auto foo(int, T...) -> void;

int main()
{
  foo(7, "");
}

However, the following code (with a leading template parameter that cannot be deduced from the function parameters) is ambiguous according to gcc:

template <typename X, typename Check, typename... T>
auto bar(Check, T...) -> void;

template <typename X, typename... T>
auto bar(int, T...) -> void;

int main()
{
  bar<void>(7, "");
}

On the other hand, clang, msvc and icc are quite happy with this.

Which compiler is right?

References to the respective sections of the standard preferred.

Aucun commentaire:

Enregistrer un commentaire