为什么istream对象可以用作bool表达式?

che*_*eng 23 c++ operator-overloading istream

有谁知道为什么istream对象可以用作bool表达式?例如:

ifstream input("tmp");
int iValue;
while (input >> iValue)
    //do something;
Run Code Online (Sandbox Code Playgroud)

这里input >> iValue返回对ifstream对象的引用.我想知道为什么这个对象可以用作bool表达式.
我查看ifstream类,发现这可能是由于以下成员函数:

operator void * ( ) const;
Run Code Online (Sandbox Code Playgroud)

有关此功能的详细信息,请参见此处
如果是的话,有人可以向我解释这个功能吗?该函数的原型与通常的运算符重载声明不同.这个函数的返回类型是什么?
如果不是,那么ifstream对象可以用作bool表达式的原因是什么?
期待您的帮助!

Che*_*Alf 23

在C++ 11中改变了使用istream作为布尔表达式的确切机制.void*正如您所发现的,以前是隐式转换.在C++ 11中,它explicit转换为bool.

启用了在布尔表达式中使用istream或ostream,以便C++程序员可以继续使用带有副作用的表达式作为whileor for循环的条件:

SomeType v;

while( stream >> v )
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

程序员这样做并希望这样做的原因在于它提供了更简洁的代码,代码更容易一目了然,比如...

for( ;; )
{
    SomeType v;

    stream >> v;
    if( stream.fail() )
    {
        break;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然而,在某些情况下,甚至这种冗长的结构也是优选的.这取决于.

干杯&hth.,


Pup*_*ppy 7

它是给定类型的强制转换运算符.operator T ()是类型T的if强制ifstream转换操作符.在语句中,将转换为void*,然后void*转换为bool.

  • `void*转换为bool` ..这不正确.相反,我会说,`void*与0比较. (4认同)
  • @iammilind:这是对的.指针转换为`bool`.检查§4.12和§6.4.1. (4认同)
  • 与0的比较是如何实现转换,但是说它被转换是完全正确的. (3认同)