Câu hỏi của tôi có thể được rút ra, chuỗi được trả về từ đâu stringstream.str().c_str()
trong bộ nhớ và tại sao nó không thể được gán cho một const char*
?
Ví dụ mã này sẽ giải thích nó tốt hơn tôi có thể
#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;
}
Giả định stringstream.str().c_str()
có thể được gán const char*
cho một lỗi dẫn đến một lỗi khiến tôi mất một thời gian để theo dõi.
Đối với điểm thưởng, bất cứ ai cũng có thể giải thích tại sao thay thế cout
tuyên bố bằng
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
in dây có đúng không?
Tôi đang biên dịch trong Visual Studio 2008.
str()
được triển khai theo cách mà RVO có thể khởi động (rất có thể), trình biên dịch được phép xây dựng kết quả trực tiếp vàotmp
, trốn tránh tạm thời; và bất kỳ trình biên dịch C ++ hiện đại nào cũng sẽ làm như vậy khi tối ưu hóa được kích hoạt. Tất nhiên, giải pháp liên kết tham chiếu liên kết đảm bảo không có bản sao, vì vậy có thể tốt hơn - nhưng tôi nghĩ nó vẫn đáng để làm rõ.