为什么 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 操作行为一致:
结论
虽然 Stroustrup 的引用准确地描述了 C 11 之前的 istream 和 ostream 操作的行为,但 stringstream 的后 C由于采用了不同的提取机制,11 行为偏离了此描述。在 C 11 及更高版本中,使用 stringstream 操作时必须注意这种改变的行为。
以上是为什么在 C 11 及更高版本中'stringstream”会在提取失败时修改目标变量?的详细内容。更多信息请关注PHP中文网其他相关文章!