Występuje zachowanie o przeciążeniu, które wydaje się bardzo nieoczekiwane. Poniższy kod jest odrzucana z błędem wieloznaczności zarówno przez gcc i brzękiem:Nieoczekiwana rozdzielczość przeciążania z domyślnym parametrem szablonu funkcji
template <typename T>
struct A
{
typedef T key_type;
};
template <typename T>
void foo(A<T> rng, T val);
template <typename T, typename U = T>
void foo(T, typename U::key_type);
int main()
{
A<int> i;
foo(i, 0);
}
błędu jest:
test.cpp:16:5: error: call to 'foo' is ambiguous
foo(i, 0);
^~~
test.cpp:8:6: note: candidate function [with T = int]
void foo(A<T> rng, T val);
^
test.cpp:11:6: note: candidate function [with T = A<int>, U = A<int>]
void foo(T, typename U::key_type);
^
Spodziewam się zarówno do dokładnego dopasowania ale pierwszy przeciążenie wygrać w częściowego uporządkowania , ponieważ w pierwszym parametrze A<T>
jest bardziej wyspecjalizowany niż T
.
Co wieje zdanie jest to, że jeśli zmienię drugi podpis:
template <typename T, typename U = T>
void foo(T, typename T::key_type);
zarówno gcc i brzękiem teraz zaakceptować kod i wybierz pierwszy przeciążenie jak bym początkowo spodziewać.
Nie widzę, jak ta zmiana może mieć wpływ na zachowanie: wszystko, co zrobiłem, było zastąpienie użycia parametru szablonu, który nie był ani jednoznacznie określony, ani wydedukowany (U
) z jego domyślną wartością (T
).
Z drugiej strony zachowanie przed zmianą jest nieoczekiwane, więc może czegoś brakuje.
Może ktoś wyjaśnić:
- dlaczego pierwsza sprawa jest niejednoznaczna; i
- dlaczego wprowadzona przeze mnie zmiana rozwiązuje niejednoznaczność?
Jeśli jest to istotne, wersje kompilacji, które testowałem, to gcc 4.8.0 i najnowsza kompilacja trunków.
+1, ale dla mnie wygląda to jak prosty błąd kompilatora. Domyślne argumenty szablonu szablonu są nowe. – Potatoswatter
@Potatoswatter: Podejrzewam, że tak samo, ale ponieważ gcc i clang mają identyczne zachowanie, chciałem dokładnie sprawdzić, czy nie jest to pewne zachowanie zgodne z normami, o którym nie wiem, zanim je zgłosiłem. – HighCommander4
Zauważyłem wiele pokrywania się ich błędów, dziwactw i komunikatów diagnostycznych ... bez względu na konsekwencje prawne, nie są to projekty czystych pomieszczeń. – Potatoswatter