#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++ отлично справляется с этим, чего я не понимаю.