Moje pytanie można sprowadzić do tego, gdzie stringstream.str().c_str()
w pamięci znajduje się zwracany ciąg i dlaczego nie można go przypisać do const 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, które stringstream.str().c_str()
można przypisać do, const char*
doprowadziło do błędu, którego wytropienie zajęło mi trochę czasu.
Jeśli chodzi o punkty bonusowe, czy ktoś może wyjaśnić, dlaczego zastąpić cout
oświadczenie
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
drukuje napisy poprawnie?
Kompiluję w Visual Studio 2008.
str()
jest zaimplementowane w taki sposób, że RVO może się uruchomić (co jest bardzo prawdopodobne), kompilator może bezpośrednio skonstruować wynik dotmp
, eliminując tymczasowe; a każdy nowoczesny kompilator C ++ zrobi to, gdy optymalizacje są włączone. Oczywiście rozwiązanie bind-to-const-reference gwarantuje brak kopiowania, więc może być lepsze - ale pomyślałem, że nadal warto to wyjaśnić.