คำถามของฉันสามารถต้มลงไปที่ใดสตริงกลับมาจากการ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 รับประกันไม่คัดลอกดังนั้นอาจจะดีกว่า - แต่ฉันคิดว่ามันยังคงคุ้มค่าชัดเจน