Benim sorum şu şekilde kaynatılabilir, dize stringstream.str().c_str()
bellekte canlı olarak geri döndü ve neden a'ya atanamıyor const char*
?
Bu kod örneği benden daha iyi açıklayacaktır
#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;
}
Bir yola stringstream.str().c_str()
atanabilecek varsayım, const char*
izlememi biraz zaman alan bir hataya yol açtı.
Bonus puanları için, herkes cout
ifadeyi neden değiştirdiğini açıklayabilir mi?
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
dizeleri doğru yazdırır?
Visual Studio 2008'de derliyorum.
str()
getirmeyeceği unutulmamalıdır - eğer RVO devreye girecek şekilde (çok muhtemeldir) uygulanırsa, derleyicinin sonucu doğrudan oluşturmasına izin verilir içinetmp
geçici eliding; ve tüm modern C ++ derleyicileri optimizasyonlar etkinleştirildiğinde bunu yapar. Elbette, bağlama-bağlama-referans çözümü kopyalanmayı garanti etmez, bu yüzden tercih edilebilir - ama yine de netleştirmeye değer olduğunu düşündüm.