"0" is magic because it is also the value of a null pointer.
note: candidates are: virtual size_t SoftwareSerial::write(uint8_t)
note: size_t Print::write(const char*)
The actual complaint from the compiler is that it can't tell an int (uint8_t) from a null pointer (const char *), not that it can't tell an int from a char.
I think this was/is because C compiler geeks are lazy and didn't want to write ((char*)0) around all the null pointers they were passing around. Proper usage would be:
(please don't use "byte"; it's a terribly overloaded term that is being removed from all sorts of official libraries!)