https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80662
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #5) > Reduced thanks to K-ballo: Hmm, clang compiles and gives: member While both GCC and ICC compiles and gives: non-member And MSVC rejects it with: <source>(15): error C2593: 'operator <<' is ambiguous <source>(10): note: could be 'void my_stream::operator <<<const char(&)[12]>(T)' with [ T=const char (&)[12] ] <source>(6): note: or 'void operator <<<my_stream,char[12]>(C &&,const T (&))' with [ C=my_stream, T=char [12] ] <source>(15): note: while trying to match the argument list '(my_stream, const char [12])' This might be the first time I have seen all four compiler full on disagree for a testcase like this (with GCC and ICC agreeing).