Minha pergunta pode ser resumida em: para onde a string retornada fica stringstream.str().c_str()
na memória e por que não pode ser atribuída a const char*
?
Este exemplo de código explicará melhor do que eu posso
#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;
}
A suposição que stringstream.str().c_str()
poderia ser atribuída a um const char*
levou a um bug que demorou um pouco para ser rastreado.
Para pontos de bônus, alguém pode explicar por que substituir a cout
declaração por
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
imprime as cordas corretamente?
Estou compilando no Visual Studio 2008.
str()
for implementado de forma que o RVO possa entrar em ação (o que é muito provável), o compilador poderá construir o resultado diretamente entrandotmp
, elegendo o temporário; e qualquer compilador C ++ moderno fará isso quando as otimizações estiverem ativadas. Obviamente, a solução de ligação a const-reference garante nenhuma cópia, portanto pode ser preferível - mas achei que ainda vale a pena esclarecer.