https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107813
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- GCC 10 is correct. The template is a exact match for the argument, accepting any argument type, so the enum should not be converted to unsigned char. When you call this->o << t then there is no exact match, so an implicit conversion to unsigned char happens.