Какая польза от «целей» в эти дни? - PullRequest
14 голосов
/ 26 февраля 2010

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

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?

Ответы [ 2 ]

7 голосов
/ 26 февраля 2010

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

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

6 голосов
/ 26 февраля 2010

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

...