Mi pregunta se puede resumir en: ¿dónde se devuelve la cadena de la stringstream.str().c_str()
memoria en vivo y por qué no se puede asignar a una const char*
?
Este ejemplo de código lo explicará mejor de lo que puedo
#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;
}
La suposición que stringstream.str().c_str()
podría asignarse a un const char*
condujo a un error que me llevó un tiempo rastrear.
Para obtener puntos de bonificación, ¿alguien puede explicar por qué reemplazar la cout
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.
str()
se implementa de tal manera que RVO pueda entrar en acción (lo cual es muy probable), el compilador puede construir el resultado directamente dentrotmp
, eludiendo lo temporal; y cualquier compilador de C ++ moderno lo hará cuando las optimizaciones estén habilitadas. Por supuesto, la solución bind-to-const-reference garantiza la no copia, por lo que puede ser preferible, pero pensé que aún vale la pena aclararlo.