Какое использование есть для «концов» в наши дни?
-
22-09-2019 - |
Вопрос
Я наткнулся на тонкую ошибку пару дней назад, где код выглядел примерно так:
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()
Это означало, что ноль был замаскирован, так как он стал просто разделителем. Однако, когда это изменилось, чтобы использовать строки повсюду, NULL внезапно что -то имело в виду, и сравнения, такие как:
if ( theWholeLot == "7HABITS" )
потерпит неудачу. Это заставило меня задуматься: предположительно причина ends
это возврат к дням ostrstream
Когда поток обычно не прекращался с нолью и должен был быть так, чтобы str()
(который затем изготал не string
но а char *
) будет работать правильно.
Однако теперь, когда невозможно выбрать char *
из ostringstream
, с использованием ends
не только лишняя, но потенциально опасно, и я собираюсь удалить их всех из кода моих клиентов.
Может ли кто -нибудь увидеть очевидную причину для использования ends
в std::string
только окружающая среда?
Решение
Вы, по сути, ответили на свой собственный вопрос, это так же подробно, что необходимо. Я, конечно, не могу придумать никакой причины использовать std::ends
когда std::string
а также std::stringstream
справиться со всем этим для вас.
Итак, чтобы явно ответить на ваш вопрос, нет, нет причин использовать std::ends
в std::string
только окружающая среда.
Другие советы
Есть некоторые API, которые ожидают «строкового массива» с несколькими расторженными строками, двойным ноль, чтобы отметить конец. Раймонд Чанг недавно недавно В блоге об этом, больше всего, чтобы продемонстрировать, как часто это набирает шары.