Мой вопрос можно свести к следующему: где строка, возвращенная из stringstream.str().c_str()
памяти, находится в памяти и почему ее нельзя присвоить a 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-reference гарантирует отсутствие копирования, поэтому может быть предпочтительнее, но я подумал, что это все же стоит уточнить.