http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46831
--- Comment #1 from Johannes Schaub <schaub.johannes at googlemail dot com> 2010-12-07 04:09:25 UTC --- ------------------------------------------------- GCC also rejects this valid code: ---------- struct A { template<typename T = void> operator short(); template<typename T = void> operator long(); }; void f(long); void f(int); // this call is not ambiguous, but GCC claims it is int main() { f(A()); } Also, if we make the second conversion functon a non-template, GCC suddenly accepts the code (right at it, the code is still valid). But that indicates that GCC has internally the handling of 13.3.3[over.match.best]p1 bullet 4 and bullet 5 reversed: It first checks whether one is a template and the other is a non-template, and only then checks whether the return type of F1 converts better than the return type of F2. -------------------------------------------------- We can make this to crash on valid code, too: -------- struct B { }; struct D : B { }; struct A { template<typename T = void> operator D&(); operator long(); }; void f(long); void f(B&); int main() { f(A()); }