Code:
#include<tuple>
#include<iostream>
template<class Head, class... Tail>
void f(std::tuple<Head, Tail...> )
{
std::cout << "std::tuple<Head, Tail...>\n";
}
template<class Head>
void f(std::tuple<Head> )
{
std::cout << "std::tuple<Head>\n";
}
int main()
{
f(std::tuple<int>{});
}
GCC accepts this code silently. But Clang generates error:
test.cpp:18:5: error: call to 'f' is ambiguous
f(std::tuple<int>{});
^
test.cpp:5:6: note: candidate function [with Head = int,
Tail = <>]
void f(std::tuple<Head, Tail...> )
^
test.cpp:11:6: note: candidate function [with Head = int]
void f(std::tuple<Head> )
^
Which compiler is right? Isn't it abiguity in fact?