When you say a "public header". if you mean the entry point to a library, I never use std::string an the interface to any library because it is non-portable. Your std::string may have a different representation to mine if we are using different versions of STL.
I have a wrapper class portable_basic_string and the typedef to portable_string with char as its type is in its own header. pstr_cref can also be put in its own header in which case you don't need to search around to see what it means.
