While I'm all in favor of starting to port the codebase to C++11 (it's been the official standard for three years now), I don't think that shared_ptr<string> really serves the same purpose as a reference-counted string. One of the benefits of a proper ref-counted string is that it also provides string pooling. For this we'd need a wrapper class to provide COW behavior if the shared_ptr is not unique. Also, while we're at it, we might consider using std::u32string instead. We could convert quite easily to/from UTF-8 as needed, but bear in mind that std::string doesn't guarantee its operations to operate on characters but just bytes (UTF-8 characters can consume up to 4 bytes), so UTF-8 strings could easily become corrupted. Using u32string would provide this guarantee for UTF-32 characters, and help prevent corruption.