For 2, It seems more like a problem with stringstream - I think lexical_cast does:
stringstream ss; ss << input; ss >> output; return output;
Not quite. In lexical_cast there's a code to specifically *not* ignore leading whitespace - look for for the line 'stream.unsetf(std::ios::skipws)'. It also contains a code to specifically *ignore* trailing whitespace (but not other characters) - look for 'stream >> std::ws'. So this was done intentionally, even though mistakenly in my opinion. My version of 'lexical_cast<T, string>' looks like (I hope I remember correctly): template <typename T> T convert_from_string(const string &str) { T val; istringstream iss(str); iss >> noskipws >> val; if (iss.fail() || !iss.eof()) throw ...; return val; } and it works fine. No problems with the stringstream.