The program below fails to compile with gcc 4.1.0. According to 14.8.2, p2, template argument deduction must fail if it would result in an invalid type. Bullet 1 in the same paragraph specifically mentions "attempting to create an array with an element type that is void" as one possible reason for such a failure. Thus in the program below the first overload of foo must not be considered a candidate for overload resolution since doing so would result an invalid type (A<int, void>::X where X is an array of void).
See also bug 27402. $ cat t.cpp && gcc t.cpp template <class, class U = void> struct A { typedef U X [1]; }; template <class T> struct B { typedef T Y; }; template <class T> A<T> foo (T) { return A<T>(); } template <class T> B<T> foo (T) { return B<T>(); } int main () { foo (0); } t.cpp: In function 'int main()': t.cpp:12: error: call of overloaded 'foo(int)' is ambiguous t.cpp:5: note: candidates are: A<T, void> foo(T) [with T = int] t.cpp:8: note: B<T> foo(T) [with T = int] -- Summary: invalid types produced out of argument deduction (SFINAE bug) Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: sebor at roguewave dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27527