Пару дней назад я обнаружил небольшую ошибку, когда код выглядел примерно так:
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()
. Это означало, что нуль был замаскирован, поскольку он стал просто разделителем. Однако, когда это изменилось, чтобы использовать строки повсюду, ноль внезапно означал что-то и сравнения, такие как:
if ( theWholeLot == "7HABITS" )
потерпит неудачу. Это заставило меня задуматься: предположительно, причина ends
- это возврат к временам ostrstream
, когда поток обычно не завершался нулевым значением и должен был быть таким, чтобы str()
(который затем отбрасывал не string
, а char *
) работал правильно .
Однако теперь, когда невозможно исключить char *
из ostringstream
, использование ends
не только излишне, но и потенциально опасно, и я подумываю удалить их все из кода моих клиентов.
Может ли кто-нибудь увидеть очевидную причину использования ends
в среде только std::string
?
std::ends
: http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 - person Johannes Schaub - litb   schedule 26.02.2010cout << ends;
предоставит их. - person Johannes Schaub - litb   schedule 26.02.2010