Какая польза от "концов" в наши дни?
Пару дней назад я наткнулся на небольшую ошибку, в которой код выглядел примерно так:
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, которые ожидают "строковый массив" с несколькими нулевыми завершающими строками, двойной ноль для обозначения конца. Рэймонд Чанг совсем недавнонаписал об этом в блоге , прежде всего, чтобы продемонстрировать, как часто это происходит.