为什么ifstream::inFile.get(c) 返回的类型是istream&,却能用于while 条件判断?

79 阅读1分钟

为什么ifstream::inFile.get(c) 返回的类型是istream&,却能用于while 条件判断?

以下代码是否有问题?

 while (inFile.get(c))
 {
    cout<<"*** while c="<<c<<endl;
 }
    

答案是没啥问题!!!

原因是C++中可以把istream& 转换为bool类型。转换的方式是ifstream类重载了的bool()方法。 源码:

public:
      ///@{
      /**
       *  @brief  The quick-and-easy status check.
       *
       *  This allows you to write constructs such as
       *  <code>if (!a_stream) ...</code> and <code>while (a_stream) ...</code>
      */
#if __cplusplus >= 201103L
      explicit operator bool() const
      { return !this->fail(); }
#else
      operator void*() const
      { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
#endif

      bool
      operator!() const
      { return this->fail(); }
 for (size_t i = 0; i < 100; i++)
    {
     istream& ist = inFile.get(c);
     bool flags = ist.operator bool();
     cout<<"*** ist="<< flags <<endl;
     // std::clog << "typeid(inFile.get(c)).name()---" <<i<<"--"<<typeid(inFile.get(c)).name()<< std::endl;
    }

看到了没:

#if __cplusplus >= 201103L
      explicit operator bool() const
      { return !this->fail(); }

我们可以自己调用一下转换,试试到底能不能istream& 转bool:

 for (size_t i = 0; i < 100; i++)
    {
     istream& ist = inFile.get(c);
     bool flags = ist.operator bool();
     cout<<"*** ist="<< flags <<endl;
     // std::clog << "typeid(inFile.get(c)).name()---" <<i<<"--"<<typeid(inFile.get(c)).name()<< std::endl;
    }

输出:

*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=1
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0
*** ist=0