Stan has posted an important entry that goes a long way in explaining how string literals work in C++/CLI. Check it out here:
The Type of a String Literal Revisited ...
To briefly review: In ISO-C++, the type of "Pooh" is const char. There is no exact match of "Pooh" to any of the three instances of foo(). However, the trivial conversion of const char to const char* represents a best match, and this is why (3) is invoked. There was no built-in notion of a string literal having any relationship to System::String.
And this was changed in the design of C++/CLI. Actually, it was changed twice, and that is the talking point of this entry – to explain why the initial change had to be further refined.