Он выживет, но полагаться на этот факт может сбить с толку, и это может привести к тому, что клиенты вашего кода достигнут стандарта C ++, зададут вопросы о переполнении стека и т.д .;-). Например, что происходит, когда кто-то делает:
Bar b = GetFoo();
CallMeBar(b);
На этот раз Foo прошел до вызова CallMeBar, но большинство программистов хотели бы, чтобы преобразования создавали независимый объект и, следовательно, чтобы код вел себя так же, как:
CallMeBar(GetFoo());
Вот почему std::string
не имеет неявного приведения к char*
, в отличие от CString
приведения к LPCTSTR
. Вместо этого std::string
имеет функцию-член c_str()
, которая имеет такое же ограничение, но делает несколько более очевидным при вызове кода, что это не реальное преобразование:
CallMePtr(GetString().c_str()); // OK
char* p = GetString().c_str(); // Bad
CallMePtr(p); // Badness manifests
const string &s = GetString(); // use "the most important const"
CallMePtr(s.c_str()); // Best be on the safe side