数日前、コードが次のような微妙なバグに遭遇しました。
ostringstream ss;
int anInt( 7 );
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
問題は、endsが '\0' を に貼り付けていたostringstreamため、theWholeLot実際には次のように見えたことです"7HABITS\0"(つまり、最後に null が表示されます)。
を使用して部分をtheWholeLot取得するために使用されていたため、これは表示されませんでした。これは、ヌルが単なる区切り文字になったため、マスクされたことを意味します。ただし、これが文字列を使用するように変更されたとき、null は突然何かを意味し、次のような比較が行われました。const char *string::c_str()
if ( theWholeLot == "7HABITS" )
失敗するでしょう。これは私に考えさせました:おそらく理由は、ストリームが通常はnullで終了せず、(その後、 a ではなく a をキャストする)が正しく機能するようにする必要があっendsた時代への逆戻りです。ostrstreamstr()stringchar *
ただし、 achar *から aをキャストすることができないためostringstream、使用endsは不要であるだけでなく、潜在的に危険であり、クライアント コードからすべて削除することを検討しています。
唯一の環境で使用endsする明白な理由を誰でも見ることができますか?std::string