In article <[EMAIL PROTECTED]>, Vladimir Prus <[EMAIL PROTECTED]> writes > >The principle of least astonishment can be applied in a different way. We >all know that lexical cast uses streams, and > > stringstream ss(" 1 "); > int i; > ss >> i; > cout << i << "\n"; > >certainly works. It's surprising that lexical_cast<int>(" 1 ") does not >work.
This is argument by false analogy. If the above were to fail, eg "a" was the initialiser, it won't throw an exception. Yes, there is an underlying stringstream, but lexical_cast uses stringstream; it is not stringstream. The current model ensures that, unlike I/O streams, input and output are treated more symmetrically and various constraints, such as the full conversion of a buffered representation, are strongly enforced. A quick inspection of its history reveals a move away from the looser I/O stream model of conversion. The original design was softer and more script-like in its tolerances, but the general needs that most users had were stricter. If you want the kind of behaviour described above, I suggest using -- wait for it -- std::stringstream, or writing a trim function that cuts leading and trailing space characters. The idea that lexical_cast embodies in its current form is that it allows only the _full_ conversion of the Source's stream representation to the Target type, ie all chars are significant. >BTW, I cannot find the test case for trailing space in >lexical_case_test.cpp, and... the following works with gcc 3.2: > > int main() > { > std::cout << boost::lexical_cast<int>(std::string("0 ")) << "\n"; > } > >Hmm ;-) Thanks for spotting this. That is missing, and the accommodation of that behaviour is legacy -- it is incompatible with the idea that full conversion only is supported, and the way that textual types are handled. >>>Is it >>>possible to output the stringstream content (if source -> stringstream >>>conversion was successfull?) >> >> This is something that I toyed with a long time ago, but eventually >> decided not to put in for a couple of reasons. One is the issue that the >> exception would hold a dynamically allocated string of potentially >> unbounded length, rather than just a short descriptive string. >> I was >> also concerned that the role of such an exception was more as a >> debugging tool than an exception handling medium. > >Alas, it's not very helpfull as a debugging tool as it is. No, and that's because it is not primarily intended to be a debugging tool. The only resolution I can see that accommodates this in part, without running foul of reasonable constraints on exception types, is to use a fixed-size char array that truncates the residual buffer content if necessary. Kevlin ____________________________________________________________ Kevlin Henney phone: +44 117 942 2990 mailto:[EMAIL PROTECTED] mobile: +44 7801 073 508 http://www.curbralan.com fax: +44 870 052 2289 Curbralan: Consultancy + Training + Development + Review ____________________________________________________________ _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost