我有一种情况,我抓住命令行参数和使用boost::lexical_cast<unsigned long>(my_param).我希望my_param的负值会导致lexical_cast的抛出,而是它高兴地将它们转换,以-1成为18446744073709551615.这似乎很荒谬,作为一个unsigned long的最大值为2 ^ 32-1,它看起来更像一个unsigned long长.
所以我要寻找一个既聪明的方式投下字符*输入为unsigned long,还是有办法来验证我没有接受其伪装的负值作为一个大的无符号很长很长.
有一个错误报告反对你的问题提升,这解释了为什么它的行为:
boost :: lexical_cast具有stringstream的行为,它使用std :: locale的num_get函数来转换数字.如果我们看一下编程语言的[22.2.2.1.2] - C++(或[22.2.2.1.2]工作草案,编程语言C++标准),我们将看到,num_get使用scanf的规则进行转换.在%u的C99标准中,输入值减号是可选的,因此如果读取负数,则不会出现错误,结果将是二进制补码.
还有一个建议的包装器解决方法:
https://svn.boost.org/trac/boost/ticket/5494
| 归档时间: |
|
| 查看次数: |
1255 次 |
| 最近记录: |