Я не могу представить, какие ошибки, по мнению этого человека, могут произойти, и вы должны попросить их объяснить. Как вы упомянули, ничто не может пойти не так, как ошибки выделения, которые выбрасываются и не проглатываются.
Единственное, что я вижу, что вы прямо упускаете, это то, что ss.fail()
гарантированно будет истинным после цикла while, потому что это проверяемое условие. (bool(stream)
эквивалентно !stream.fail()
, , а не stream.good()
.) Как и ожидалось, ss.eof()
также будет истинным, указывая на то, что сбой произошел из-за EOF.
Однако, может быть некоторая путаница в том, что на самом деле происходит. Поскольку getline использует delim - завершенные поля вместо delim - разделенные поля, входные данные, такие как "a\nb\n"
имеет два поля вместо трех, и это может быть удивительно. Для строк это имеет смысл (и является стандартом POSIX), но сколько полей с delim , равным '-'
, вы ожидаете найти в "a-b-"
после разбиения?
Кстати, вот как я напишу split :
template<class OutIter>
OutIter split(std::string const& s, char delim, OutIter dest) {
std::string::size_type begin = 0, end;
while ((end = s.find(delim, begin)) != s.npos) {
*dest++ = s.substr(begin, end - begin);
begin = end + 1;
}
*dest++ = s.substr(begin);
return dest;
}
Во-первых, это позволяет избежать всех проблем с iostreams, избежать лишних копий (строки поддержки stringstream; плюс temp, возвращаемая substr, может даже использовать ссылку на C ++ 0x rvalue для семантики перемещения, если поддерживается, как написано) , имеет поведение, которое я ожидаю от split (отличается от вашего), и работает с любым контейнером.
deque<string> c;
split("a-b-", '-', back_inserter(c));
// c == {"a", "b", ""}