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