Un morceau commun de code que j'utilise pour séparer de chaîne simple ressemble à ceci:Comment std :: stringstream peut-il définir un échec/un mauvais bit?
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;
}
Quelqu'un a mentionné que cette erreur silencieusement « swallow » se produisant dans std::getline
. Et bien sûr, je suis d'accord que c'est le cas. Mais il me vint à l'esprit, ce qui pourrait mal tourner ici dans la pratique que je devrais avoir à s'inquiéter. essentiellement tout se résume à ceci:
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 soutenu par une string
, donc nous n'avons pas à vous soucier des problèmes liés à la lecture d'un fichier. Il n'y a aucune conversion de type en cours ici puisque getline
lit simplement jusqu'à ce qu'il voit le délimiteur de ligne ou EOF
. Donc, nous ne pouvons pas avoir des erreurs que quelque chose comme boost::lexical_cast
doit s'inquiéter.
Je ne peux tout simplement pas penser à quelque chose en plus de ne pas allouer assez de mémoire qui pourrait mal tourner, mais cela va juste lancer un std::bad_alloc
bien avant que le std::getline
ait lieu. Qu'est-ce que je rate?
Ce qui ne va pas, c'est de renvoyer une référence à un local. – UncleBens
Bonne capture, bien que je ne voulais pas renvoyer une référence à un local, ceci est un exemple réduit pour démontrer les bases de la question –
Un 'stringstream' est soutenu par une' chaîne' que si vous n'avez pas appelé 'rdbuf (otherstreambuf)'. –