Несколько дней назад я столкнулся с небольшой ошибкой, когда код выглядел примерно так:
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()
(который затем не был * 1019) * но char *
) будет работать правильно.
Однако теперь, когда невозможно выкинуть char *
из ostringstream
, использование ends
не только излишне, но и потенциально опасно, и я собираюсь удалить их все из кода моего клиента.
Может ли кто-нибудь увидеть очевидную причину использования ends
только в среде std::string
?