【问题标题】:lexical_cast with negative number behaves differently on different machines负数的 lexical_cast 在不同的机器上表现不同
【发布时间】:2016-02-19 18:47:21
【问题描述】:

我在两个不同的设备上有相同版本的 boost,但行为却不同

lexical_cast<uint>("-1")

文档说明它应该给我 INT_MAX(2 的补码翻转),但在一台机器上我得到一个异常抛出,而在另一台机器上我得到 INT_MAX。

【问题讨论】:

  • INT_MAX?文档在哪里说的?
  • @Ant, the FAQ 讨论了将 字符串 "-1" 转换为 uint 时会发生什么(这最终依赖于 C 对 scanf 的规则),但是我在文档中看不到任何关于铸造 -1 的内容。事实上,我看不到从任何非字符串类型转换为另一种非字符串类型的任何内容,除非它表明numeric_cast“可能会提供更合理的行为”。所以,馄饨,请提供一个引用,也许告诉你为什么不使用numeric_cast
  • 忘记引用了。它用于字符串转换。很抱歉造成混乱。

标签: c++ boost lexical-cast


【解决方案1】:

显然,如果您查看 boost 的 lexical_cast 代码,则使用 interpreter &lt;&lt; arg; interpreter &gt;&gt; result&gt;&gt; 运算符中的此类代码加载和操作输入

this->setg(start, start, finish);             
std::basic_istream<CharT> stream(static_cast<Base*>(this));
stream.unsetf(std::ios::skipws);

它使用std::basic_istream,所以不同版本的libstdc++会导致lexical_cast在不同的机器上表现不同。

【讨论】:

  • .·.至少是文档错误。
  • 我不确定我是否关注你。 basic_istream 的不同版本在影响此处显示的代码方面有何不同?
  • 我不确定该代码是否相关。我唯一能找到类似代码的地方(在 Boost 1.59 中)是在 lexical_cast_old.hpp 中,它有评论:// call-by-value fallback version (deprecated)
  • 我从 boost 1_38 获得了这段代码,所以它可能不再那么有用了,但我花了好几个小时在这上面,所以即使有人从中受益,我也会是一个快乐的露营者。
猜你喜欢
  • 2011-01-11
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2021-08-16
  • 2019-09-25
相关资源
最近更新 更多