คำถามของฉันสามารถต้มลงไปที่ใดสตริงกลับมาจากการstringstream.str().c_str()
มีชีวิตอยู่ในความทรงจำและทำไมไม่สามารถที่จะได้รับมอบหมายให้const char*
?
ตัวอย่างโค้ดนี้จะอธิบายได้ดีกว่าที่ฉันสามารถทำได้
#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;
}
การสันนิษฐานที่stringstream.str().c_str()
สามารถมอบหมายให้const char*
นำไปสู่ข้อผิดพลาดที่ใช้เวลาสักครู่ในการติดตาม
สำหรับคะแนนโบนัสทุกคนสามารถอธิบายได้ว่าทำไมแทนที่cout
คำสั่งด้วย
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
พิมพ์สตริงอย่างถูกต้องหรือไม่
ฉันกำลังรวบรวมใน Visual Studio 2008
str()
มีการนำไปใช้ในลักษณะที่ RVO สามารถเตะได้ (ซึ่งมีโอกาสมาก) ผู้แปลจะได้รับอนุญาตให้สร้างผลลัพธ์โดยตรง เข้าtmp
หลบชั่วคราว และคอมไพเลอร์ C ++ ที่ทันสมัยจะทำเช่นนั้นเมื่อเปิดใช้งานการปรับให้เหมาะสม แน่นอนโซลูชันการอ้างอิงแบบ bind-to-const รับประกันไม่คัดลอกดังนั้นอาจจะดีกว่า - แต่ฉันคิดว่ามันยังคงคุ้มค่าชัดเจน