Poniższy kod świetnie się komplikuje z gcc i clang.Dlaczego te przeciążenia nie są niejednoznaczne?
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
Wygląda rozdzielczości przeciążenie wybiera pierwszy przeciążenie (jednej identity<T>::type
).
Czy ktoś mógłby wyjaśnić, dlaczego przeciążenia nie są niejednoznaczne? O ile mi wiadomo, jedyną różnicą między nimi jest to, że argumentem pierwszego jest nie wywnioskowany kontekst, a argument drugiego nie jest, ale ponieważ dostarczam argument szablonu jawnie, Nie rozumiem, dlaczego to ma znaczenie.
Interesujące. Oczywiście druga funkcja zostałaby wybrana, gdyby włączono odliczanie typu, nie tworząc jawnie 'foo (0)', ale 'foo (0)' zamiast (Bez dedukcji dla funkcji meta tożsamości)[email protected] Prowl: Nie chcę kwestionować twojej odpowiedzi, zaznacz, że twoje rozumowanie nie jest tak oczywiste, jak mogłoby się wydawać. Ustaw parametr foo jako wartość domyślną i wywołaj 'foo ()' bez parametru. Twoja argumentacja powinna nadal obowiązywać, ale teraz przeciążenia są niejednoznaczne, tak jak oczekiwał HighCommander4. Jawne tworzenie szablonów funkcji jest skomplikowane. –