Здравствуйте Odi$$ey, Вы писали:
O$>Весь вопрос в том, кто потом будет освобождать память.
O$>вариант 1. Мы сами, ручками. Смотрим что из этого получится:
Что-то тут не так...
O$>extern void f(const char*);
O$>std:string s("hello world");
O$>f(s); // f() принимает временный, неименованый указатель - > мы не сможем освободить память по этому адресу
А с какой мы должны освобождать память? Память освободится в деструкторе std:string s. Или я чего-то не понимаю?
O$>extern void f(const char*);
O$>extern std:string g();
O$>const char* p = g(); // !! std:string возвращаемый g()
O$> // сохраняется во временной переменной string
O$>f(p); // большой облом ! после выхода за строку 3
O$> // временная переменная string уничтожается
O$> // и очищает память, на которую указывает p.
O$> // Что же мы передали в f()?
строка, возвращаемая g() с равной вероятностью может умереть как до вызова f(p), так и после — это как уж разработчикам компилятора захочется.
Показан пример как не надо программировать.
Есть у меня эта "Стандартная библиотека С++ на примерах". Не в восторге. Плохой перевод, примитивные примеры. Полезность книги — нулевая :-(
Касательно первоначального вопроса пример могу привести такой:
std::string s("bla-bla-bla");
s += '\0';
s += "one more string";
std::cout << s;
С std::string::operator const char*() было бы не ясно — что выводить — то ли С-шную строку до символа '\0', то ли С++-ную целиком.