// The conversion from D* to B* is ambiguous, but that should not produce // an error, it should remove the first f overload by SFINAE. #define static_assert(TEST,STR) \ do { int ar[(TEST)?1:-1]; } while (0); struct B {}; struct B1 : B {}; struct B2 : B {}; struct D : B1, B2 {}; template T create(); typedef char one[1]; typedef char two[2]; template one &f(char (*)[sizeof static_cast(create())]); template two &f(...); int main() { static_assert(sizeof f(0) == sizeof(two), ""); static_assert(sizeof f(0) == sizeof(two), ""); }