https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80662
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced thanks to K-ballo: extern "C" int puts(const char*); template<typename C, typename T> void operator<<(C&&, T const&) { puts("non-member"); } struct my_stream { template <typename T> void operator<<(T&&) { puts("member"); } }; int main() { my_stream{} << "hello world"; }