首页 > 后端开发 > C++ > 为什么在 C 11 及更高版本中'stringstream”会在提取失败时修改目标变量?

为什么在 C 11 及更高版本中'stringstream”会在提取失败时修改目标变量?

Barbara Streisand
发布: 2024-11-26 15:46:09
原创
487 人浏览过

Why Does `stringstream` Modify the Target Variable on Extraction Failure in C  11 and Later?

为什么 stringstream >> C 11 之后提取失败时更改目标值?

Stroustrup 的“TC PL”指出,如果 istream 或 ostream 操作失败,目标变量的值应保持不变。然而,这与使用 stringstream 观察到的行为相矛盾:

#include <iostream>
#include <sstream>

int main() {
  std::stringstream ss;
  int v = 123;
  ss << "The quick brown fox.";
  if (ss >> v) {
    std::cout << "Unexpected success in reading a word into an int!\n";
  }
  std::cout << "After extraction failure: " << v << "\n";
  return 1;
}
登录后复制

尽管 Stroustrup 声称,此代码打印“提取失败后:0”。

C 11 行为修改

这个矛盾源于 C 11 之后 stringstream 行为的变化。在 C 11 之前, stringstream 使用 scanf 风格的解析方法,失败时保持目标值不变。然而,从 C 11 开始,它采用了 std::strtoll,它将零写入值变量并在提取失败时设置故障位。

此更改与修订后的 C 11 istream 和 ostream 操作行为一致:

  • 失败时,目标值设置为 0 或适当的极值。
  • failbit设置为指示失败。

结论

虽然 Stroustrup 的引用准确地描述了 C 11 之前的 istream 和 ostream 操作的行为,但 stringstream 的后 C由于采用了不同的提取机制,11 行为偏离了此描述。在 C 11 及更高版本中,使用 stringstream 操作时必须注意这种改变的行为。

以上是为什么在 C 11 及更高版本中'stringstream”会在提取失败时修改目标变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板