Una pieza común de código que utilizo para partir simple cadena tiene el siguiente aspecto:Ways std :: stringstream puede establecer un bit fallido/malo?
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
Alguien mencionó que este silencio se "golondrina" errores que ocurren en std::getline
. Y, por supuesto, estoy de acuerdo con ese es el caso. Pero se me ocurrió, lo que podría salir mal aquí en la práctica que tendría que preocuparme. Básicamente todo se reduce a esto:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
if(/* what error can I catch here? */) {
// *** How did we get here!? ***
}
return elems;
}
Un stringstream
está respaldado por una string
, por lo que no tiene que preocuparse por ninguno de los problemas asociados con la lectura de un archivo. No hay conversión de tipo aquí desde que getline
simplemente lee hasta que ve la línea delimeter o EOF
. Así que no podemos obtener ninguno de los errores que algo así como boost::lexical_cast
tiene que preocuparse.
Simplemente no puedo pensar en algo además de no asignar suficiente memoria que podría salir mal, pero eso arrojará un std::bad_alloc
incluso antes de que el std::getline
tenga lugar. ¿Qué me estoy perdiendo?
Lo que está mal es devolver una referencia a un local. – UncleBens
Buena captura, aunque no quise devolver una referencia a un local, este es un ejemplo reducido para demostrar los conceptos básicos de la pregunta –
Un 'stringstream' está respaldado por una' cadena' solo si no ha llamado 'rdbuf (otherstreambuf)'. –