为什么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