Моє запитання можна звести до того, куди повертається рядок із 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 ++ зробить це, коли ввімкнено оптимізацію. Звичайно, рішення прив’язки до контесту посилань гарантує відсутність копії, тому може бути кращим - але я вважав, що все-таки варто уточнити.