错误条件后的标准输入状态

Standard input state after error condition

以下代码片段摘自C++ Iostreams Handbook by Steve Teale。它建议在无限循环中调用cin,以便不断提示用户输入正确的输入,只有输入正确的输入才退出循环。

此代码片段工作正常,但我对 if(cin){...} 语句感到困惑。我会期待像 if(!cin.fail()){...}.

这样的东西
#include <limits.h>
#include <iostream>
using namespace std;

int main()
{
  int n;
  cin.unsetf(ios::skipws);
  // turn off whitespece skipping
  
  cout << "Enter a value for n, followed by [Enter]: " << flush;
  
  for(;;) {
    cin >> n;
    if(cin) { //cin is in good state; input was ok
      cin.ignore(INT_MAX, '\n');
                // flush away the unwanted
                // newline character
      break;
    }

    // Poster's comment (not from the author)
    // In this section of the code cin has evaluated to false
    //
    cin.clear(); // clear the error state
    cin.ignore(INT_MAX, '\n');
                 // get rid of garbage characters
    cout << "That was no good, try again: " << flush;
  }

  return 0;
}

Q) 在失败的情况下,cin 如何评估为 false(即零值或空值)?

cin 是一个对象,而不是可以设置为空的指针。此外,在 cin 求值为 false 的代码部分,我们仍然可以调用成员函数,如 clearignore.

您观察到的是继承和隐式转换的结果。更具体地说,std::cin 有一个 operator bool() 将流的状态转换为布尔值,并且该运算符 returns !fail().

std::cin 是一个全局的 std::basic_istream provided by the standard lib, and basic_istream inherits from std::basic_ios 定义函数 operator bool()

继承链为:

std::ios_base <-- std::basic_ios <-- std::basic_istream

您可能会发现 this webpage 底部的 table 有助于将 operator bool() 与流的其他状态检查功能和流的不同状态标志进行比较。