(cin >> buf &&!buf.empty())中的第二个条件是多余的吗?

Jos*_*_mr 6 c++ cin

我正在阅读C++入门书,并对以下代码示例感到好奇:

string buf;
while (cin >> buf && !buf.empty()) {
    if (buf[0] != '_')
       continue; // get another input
       //the input starts with an underscore; process buf . . .
}
Run Code Online (Sandbox Code Playgroud)

循环应忽略不以下划线开头的单词,并对以下划线开头的单词执行某些操作.

我的问题是关于这个条件

(cin >> buf && !buf.empty())
Run Code Online (Sandbox Code Playgroud)

我会说条件(!buf.empty())在(cin >> buf)为真时总是为真,所以我没有看到添加它的意义.有没有第二个条件不冗余的情况?

关于类似构造的堆栈溢出有一个先前的问题(是否可以从cin读取空字符串并且仍然从cin.good()得到真实?)其答案根本就是否定(第二个条件是多余的).

如果这是正确的,为什么它在书上?这只是一个错误?还是有一些特殊的情况,双重条件是否有意义?

小智 1

需要明确的是,operator bool() 是 badbit || 故障位,当“输入操作无法读取预期字符或任何其他类型的操作未能产生所需结果”时,故障位被设置(Langer,Kreft 1999)

string buf;
while ((cin >> buf,cin.operator bool()) && !buf.empty()) {
    if (buf[0] != '_')
       continue; // get another input
       //the input starts with an underscore; process buf . . .
}
Run Code Online (Sandbox Code Playgroud)