Mi pregunta se puede resumir a, ¿dónde está la cadena devuelta desde stringstream.str().c_str()
en vivo en la memoria y por qué no puede asignarse a const char*
?stringstream, string y char * confusión de conversión
Este ejemplo de código se 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;
}
La suposición de que stringstream.str().c_str()
podrían ser asignados a un const char*
dado lugar a un error que me tomó un tiempo para rastrear.
de puntos de bonificación, ¿alguien puede explicar por qué la sustitución de la declaración cout
con
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
muestra las cadenas correctamente?
Estoy compilando en Visual Studio 2008.
Se debe tener en cuenta que hacer una copia (como en el primer ejemplo) no necesariamente implicará una sobrecarga, si 'str()' se implementa de tal forma que RVO pueda activarse (lo cual es muy probable), el compilador puede construir el resultado directamente en 'tmp', elidiendo el temporal; y cualquier compilador moderno de C++ lo hará cuando las optimizaciones estén habilitadas. Por supuesto, la solución bind-to-const-reference garantiza la ausencia de copia, por lo que puede ser preferible, pero pensé que todavía valía la pena aclararla. –
"Por supuesto, la solución bind-to-const-reference garantiza que no se copia" <- no es así. En C++ 03, el constructor de copia debe ser accesible y la implementación puede copiar el inicializador y vincular la referencia a la copia. –
Su primer ejemplo es incorrecto. El valor devuelto por c_str() es transitorio. No se puede confiar después del final de la declaración actual. Por lo tanto, puede usarlo para pasar un valor a una función, pero NUNCA debe asignar el resultado de c_str() a una variable local. –