Какая польза от "концов" в наши дни?


Пару дней назад я наткнулся на небольшую ошибку, в которой код выглядел примерно так:

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 13

2 ответа:

Вы, по существу, ответили на свой собственный вопрос настолько подробно, насколько это необходимо. Я, конечно, не могу придумать никакой причины использовать std::ends, когда std::string и std::stringstream обрабатывают все это для вас.

Таким образом, чтобы ответить на ваш вопрос явно, нет, нет причин использовать std::ends только в среде std::string.

Есть некоторые API, которые ожидают "строковый массив" с несколькими нулевыми завершающими строками, двойной ноль для обозначения конца. Рэймонд Чанг совсем недавнонаписал об этом в блоге , прежде всего, чтобы продемонстрировать, как часто это происходит.