Рассмотрим следующее:
#include <utility>
template <int N>
using size_ = std::integral_constant<int, N>;
template <int From>
void f(size_<From>, size_<From+1> ) // (1)
{ }
template <int From, int To> // (2)
void f(size_<From>, size_<To> )
{ }
int main()
{
f(size_<0>{}, size_<1>{});
}
Оба gcc и clang сообщают о вызове как неоднозначном. Зачем? Разве не (1)
более специализированный, чем (2)
?
Примечание. Я знаю, что это легко можно зафиксировать с добавлением дополнительного enable_if_t<(To > From+1)>
в (2)
, но я бы не подумал, что мне нужно это сделать.