stringstream, string i char * zamieszanie konwersji

Moje pytanie można sprowadzić do, skąd pochodzi łańcuchstringstream.str().c_str() żyć w pamięci i dlaczego nie można go przypisać do aconst char*?

Ten przykład kodu wyjaśni to lepiej niż ja

#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    stringstream ss("this is a string\n");

    string str(ss.str());

    const char* cstr1 = str.c_str();

    const char* cstr2 = ss.str().c_str();

    cout << cstr1   // Prints correctly
        << cstr2;   // ERROR, prints out garbage

    system("PAUSE");

    return 0;
}

Założenie, żestringstream.str().c_str() może być przypisany do aconst char* doprowadziło do błędu, który zabrał mi trochę czasu na śledzenie.

Aby uzyskać dodatkowe punkty, czy ktoś może wyjaśnić, dlaczego zastąpićcout oświadczenie z

cout << cstr            // Prints correctly
    << ss.str().c_str() // Prints correctly
    << cstr2;           // Prints correctly (???)

poprawnie drukuje napisy?

Kompiluję w Visual Studio 2008.

questionAnswers(5)

yourAnswerToTheQuestion