私の質問は要約することができます。文字列は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ソリューションはコピーなしを保証するので、望ましいかもしれませんが、それでも明確にする価値があると思いました。