stringstream, string y char * confusión de conversión

Mi pregunta puede reducirse a, ¿de dónde viene la cadena que regresó?stringstream.str().c_str() vivir en la memoria, y por qué no puede ser asignado a unconst char*?

Este ejemplo de código lo explicará mejor que yo

#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;
}

El supuesto de questringstream.str().c_str() podría ser asignado a unconst char* Condujo a un error que me tomó un tiempo para localizar.

Para obtener puntos de bonificación, ¿puede alguien explicar por qué reemplazando elcout declaración con

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

imprime las cadenas correctamente?

Estoy compilando en Visual Studio 2008.

Respuestas a la pregunta(5)

Su respuesta a la pregunta