在 C 流中,失败处理的行为因流类型和语言版本而异。这种差异的例子是使用 stringstream 将单词读入整数变量时观察到的意外行为。
传统上,如 Stroustrup 的 TC PL(第 3 版)中所述,如果输入操作失败,目标变量应保留某些数据类型不变。然而,当在 stringstream 中遇到类型不匹配时,变量的值会被修改,与引用的引用相矛盾。
造成这种差异的原因在于 C 11 中实现的更改。在 C 11 之前,stringstream 采用 scanf 风格的解析来提取数字。在 C 11 中,此方法被替换为 std::strtoll 等调用函数,这些函数会在失败时修改目标。
因此,解析策略的更改引入了不同的失败行为。在 C 11 之前,目标保持不变,而在 C 11 及更高版本中,失败时目标设置为零。
要验证此理论,请参阅参考文献,例如答案中提供的那个。此参考文献解释了在 C 11 之前,提取失败会导致值未修改并设置故障位。但是,在 C 11 及更高版本中,失败会导致目标值为零并设置失败位。
此外,参考文献指出输入运算符依赖于 num_get locale 方面,该方面利用 do_get 函数。在 C 11 中,do_get 已被修改为使用 std::strtoll 和类似函数,从而导致观察到的行为变化。
以上是为什么 C Stringstream 的故障处理在 C 11 之前和之后有所不同?的详细内容。更多信息请关注PHP中文网其他相关文章!