1) Replace max("a", "b") with max("b", "a"). Run it, look closely at the result, and be enlightened.
2) Replace max("a", "b") with max<string>("a", "b"). Run it, look at the result, and be enlightened in a different way.
As a small hint, your code invokes unspecified behavior, while my code invokes undefined behavior.
If this exercise doesn't put the fear of C++ into you, then I don't know what will :-)
EDIT: Not sure if this is it, but after some digging I've found [0] on lifetimes of temporaries. As for the lacking template argument, presumably const char* is inferred and a temporary string is constructed in main?
As for max<string>("a", "b"), it implicitly converts both arguments into temporary strings, then returns a const reference to one of them. Since it's a reference to a temporary, it becomes dangling when max returns, but you can assign it to a const string& anyway. When you try to access it, you'll get garbage or crash.