Rozważmy następujący:Niejednoznaczne wezwanie do przeładowania szablonów funkcji - nawet jeśli jest się bardziej wyspecjalizowanym?
#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>{});
}
Zarówno gcc i raport dzyń wezwanie jako niejednoznaczne. Czemu? Czy nie jest bardziej wyspecjalizowany niż (1)
niż (2)
?
Uwaga: Wiem, że można to łatwo naprawić za pomocą dodatkowego enable_if_t<(To > From+1)>
wrzuconego do (2)
, ale nie sądziłem, że muszę to zrobić.
Czy nie dlatego 'From + 1 'nie jest wywnioskować, stąd sama odliczenie * * gdy uda weryfikowane przed pewnymi unikalnymi wartościami jak' size_ {}, size_ {} 'generowane przed przeciążeniem (2)? –
@ Piotrotknicki §14.8.2.4/11: "W większości przypadków wszystkie parametry szablonu muszą mieć wartości, aby odliczenie mogło się powieść, ale dla częściowego celu zamówienia parametr szablonu może pozostać bez wartości pod warunkiem, że nie jest używany w typach używane do częściowego porządkowania. [* Uwaga *: ** Parametr szablonu używany w niezorientowanym kontekście jest uważany za użyty. ** - * końcowy przypis *) " – Columbo