Несколько дней назад я столкнулся с тонкой ошибкой, где код выглядел примерно так:
ostringstream ss;
int anInt( 7 );
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
Проблема заключалась в том, что ends вставлял '\ 0' в ostringstream, поэтому theWholeLot действительно выглядел как "7HABITS\0" (т.е. нуль в конце)
Теперь это не появилось, потому что theWholeLot использовался для приема части const char * с помощью string::c_str(). Это означало, что нуль был замаскирован, поскольку он стал просто разделителем. Однако, когда это изменилось, чтобы использовать строки повсюду, значение null внезапно означало что-то и сравнения, такие как:
if ( theWholeLot == "7HABITS" )
не удастся. Это заставило меня задуматься: предположительно причина ends - возврат к дням ostrstream, когда поток обычно не заканчивается нулем и должен быть таким, чтобы str() (который затем выдавал не a string, но a char *) будет работать правильно.
Однако теперь, когда невозможно исключить a char * из ostringstream, использование ends не только лишнее, но и потенциально опасно, и я планирую удалить их все из кода моих клиентов.
Может ли кто-нибудь увидеть очевидную причину использования ends в среде std::string?