#include <tuple>
template<int I>
struct A {};
template<int I, typename... T>
void f(A<I>, std::tuple<T *...>) {}
template<typename... T>
void f(A<0>, std::tuple<T *...>) {}
int main()
{
f(A<0>{}, std::tuple<char*, int*, float*>{});
}
第二个重载的f
更加专业化吗? g++ 4.9.2说这个调用是有歧义的,而clang 3.6.0则接受它。哪个编译器是正确的?
有趣的是,如果您将std::tuple<T *...>
更改为std::tuple<T...>
,g++就可以正常工作,但我不理解为什么。