Pertanyaan saya dapat didiskusikan, di mana string kembali dari stringstream.str().c_str()
hidup dalam memori, dan mengapa tidak dapat ditugaskan ke const char*
?
Contoh kode ini akan menjelaskannya lebih baik daripada yang saya bisa
#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;
}
Asumsi yang stringstream.str().c_str()
dapat ditugaskan ke const char*
menyebabkan bug yang saya butuh waktu untuk melacak.
Untuk poin bonus, adakah yang bisa menjelaskan mengapa mengganti cout
pernyataan itu dengan
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
mencetak string dengan benar?
Saya sedang menyusun di Visual Studio 2008.
str()
diterapkan sedemikian rupa sehingga RVO dapat menendang (yang sangat mungkin), kompiler diizinkan untuk membangun hasilnya secara langsung ke dalamtmp
, menghilangkan yang sementara; dan setiap kompiler C ++ modern akan melakukannya ketika optimisasi diaktifkan. Tentu saja, solusi bind-to-const-reference menjamin tidak ada salinan, jadi mungkin lebih disukai - tapi saya pikir itu masih layak diklarifikasi.